【发布时间】:2016-03-19 03:00:32
【问题描述】:
我正在尝试通过 sbt 插件添加库依赖项。应该根据二进制 scala 版本将依赖项添加到每个子项目中,因此我遍历每个子项目。
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
}
但是这不起作用 - 打印的输出显示没有通过 libraryDependencies in projRef += 附加库依赖项的痕迹,也没有发出任何错误,留下后续步骤以故障转移丢失的依赖项。这种技术可能有什么问题?
您首先会问为什么需要这样做?为什么要通过这样的 sbt 插件添加库依赖项?
虽然我们在 sbt addCompilerPlugin 中有,但它不能用于有参数的编译器插件(-Xplugin 必须指定 jarac 的路径,以便它接受编译器插件参数,就实验而言显示)。因此,在将编译器插件解析为库依赖项后,我们需要通过-Xplugin 注入编译器插件(然后调整其文件路径位置以检查update 的结果)。因此,我们确实需要通过 sbt 插件添加库依赖项。我们还需要为每个子项目执行此操作,因为多项目构建可能包含不同 scala 版本的子项目 - 每个子项目都必须注入二进制兼容的编译器插件,以保持二进制兼容性。
顺便说一句,这可能会照亮我在黑暗中的某些东西:
在根项目的 projectSettings 覆盖中添加库依赖项时 - 如下所示 - 依赖项似乎已解决,但这没用,因为它会将相同的二进制版本应用于所有子项目,这与手头的任务(一些子项目自然会因二进制不兼容而崩溃)。另外我认为它会覆盖根的设置,而这里的目标是附加一个设置而不是覆盖现有设置。
object Plugin extends AutoPlugin {
override lazy val projectSettings = Seq(
...
}
一对线索?
为每个子项目附加 scalacOptions - 使用相同的技术 - 很简单。
将
+=应用于上面的libraryDepenencies,甚至不会影响inspect libraryDependencies的输出,这与在AutoPlugin的override lazy val projectSettings块内使用相同的习语不同。
【问题讨论】:
-
这里没有 sbt 的语法高亮显示....
-
问题解决了吗?