我编写了一个名为 sbt-jumi 的 sbt 插件,它为 Jumi 实现了 sbt 集成。现在 sbt-jumi 插件取决于当前的 Jumi 版本。
这是插件的 build.sbt 中的相关行:
libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.5.376"
插件的用户会将其添加到他的
project/plugins.sbt
文件中:
addSbtPlugin("fi.jumi.sbt" % "sbt-jumi" % "0.1.0")
现在假设Jumi 0.6.400已经发布并且向后兼容。 sbt-jumi 插件的用户如何将其配置为使用 Jumi 0.6.400,而无需我发布新版本的插件?
这里是如何在 Maven 中做到这一点。但是如何在 sbt 中做到这一点?
覆盖插件的依赖关系与覆盖正常依赖关系的方式相同,只不过配置必须输入到
project/plugins.sbt
中。 库管理中解释了覆盖依赖关系。总结如下:
如果您希望使用的版本大于您将通过传递获得的依赖项,则 sbt 将默认使用较大的版本。您可以更改冲突管理器来更改默认行为 - 例如,这将在冲突时产生错误:
conflictManager := ConflictManager.strict
换句话说,这在
project/plugins.sbt
中是可行的:
libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.6.400"
您可以使用
reload plugins
然后使用 show update
检查您的插件依赖关系。现在应将旧版本显示为“(EVICTED)”。
如果您希望使用的版本低于默认依赖项,那么您将需要进行不同的覆盖。一种方法是强制依赖:
libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.4.350" force()
另一种方法是使用
dependencyOverrides
设置:
dependencyOverrides += "fi.jumi" % "jumi-launcher" % "0.4.350"
这两种方法的区别在于重写不会引入直接依赖。我认为差异对于插件来说并不重要,但是对于已发布的工件来说,它有
一些差异。
本身也是一个sbt插件,那么答案会略有不同。
所有这些变化都在project/plugins.sbt
dependencyOverrides += {
val sbtV = (pluginCrossBuild / sbtBinaryVersion).value
val scalaV = (update / scalaBinaryVersion).value
val dependency = "fi.jumi" % "jumi-sbt" % "{version}"
sbt.Defaults.sbtPluginExtra(dependency, sbtV, scalaV)
}
这只是复制了 addSbtPlugin
在幕后所做的事情。
(我在此示例中列出了 scala-xml,因为这是流行的插件依赖项,导致与插件库当前部分 2.x 采用发生所有冲突)
libraryDependencySchemes ++= Seq(
"org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always
)