private def inject(): State => State = { state => val extracted: Extracted = Project.extract(state) val enrichedLibDepSettings = extracted.structure.allProjectRefs map { projRef => val projectScalaVersion = (scalaBinaryVersion in projRef) libraryDependencies in projRef += compilerPluginOrg % (compilerPluginArtifact + "_" + projectScalaVersion.value) % compilerPluginVersion % "provided" } val newState = extracted.append(enrichedLibDepSettings,state) val updateAfterLibAppend = extracted.structure.allProjectRefs map { projRef => println("running update: " + EvaluateTask(extracted.structure,update,newState,projRef)) } state }
但是这不起作用 – 打印输出显示没有通过projRef =中的libraryDependencies附加的库依赖关系的跟踪,也没有发出任何错误,留下后续步骤来故障转移缺少的依赖项.这种技术可能有什么问题?
您会问为什么首先需要这个?为什么通过像这样的sbt插件添加库依赖?
虽然我们在sbt addCompilerPlugin中,它不能用于具有参数的编译器插件(-Xplugin带有jar的路径必须指定给scalac,因为它接受编译器插件参数,就实验而言).因此我们需要在将它解析为库依赖关系之后通过-Xplugin注入编译器插件(然后调整其文件路径位置以检查更新结果).因此我们需要通过sbt插件添加库依赖项.我们还需要为每个子项目执行此操作,因为多项目构建可能包含不同scala版本的子项目 – 每个项目都必须注入二进制兼容的编译器插件,以保持二进制兼容性.
顺便说一句,这可能会照亮我在黑暗中的事情:
在根项目的projectSettings覆盖中添加库依赖项时 – 如下所示 – 依赖项似乎已解决,但这是无用的,因为它会将相同的二进制版本应用于所有子项目,这违背了任务的性质手边(一些子项目自然会崩溃二进制不兼容).另外我认为它将覆盖root的设置,而这里的目标是附加一个不覆盖现有设置的设置.
object Plugin extends AutoPlugin { override lazy val projectSettings = Seq( ... }
一对线索?
>为每个子项目附加scalacOptions – 使用相同的技术 – 只是起作用.
>将=应用于上面的libraryDepenencies,甚至不会影响inspect libraryDependencies的输出,这与在AutoPlugin的override lazy val projectSettings块中使用相同的习惯用法不同.
这意味着您可以使用典型的设置/任务表示法在此处添加您的人工制品,例如:
def projectSettings = Seq( libraryDependencies += { val bin = scalaBinaryVersion.value ... } )
请注意,这是=,而不是:=.这有帮助吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。