如何覆盖sbt插件的依赖?

问题描述 投票:0回答:3

我编写了一个名为 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 中做到这一点?

plugins sbt dependency-management
3个回答
39
投票

覆盖插件的依赖关系与覆盖正常依赖关系的方式相同,只不过配置必须输入到

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"

这两种方法的区别在于重写不会引入直接依赖。我认为差异对于插件来说并不重要,但是对于已发布的工件来说,它有

一些差异


1
投票
如果你要覆盖的依赖项

本身也是一个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

 在幕后所做的事情。


0
投票
将libraryDependencySchemes添加到plugin.sbt文件将允许在插件中覆盖版本

(我在此示例中列出了 scala-xml,因为这是流行的插件依赖项,导致与插件库当前部分 2.x 采用发生所有冲突)

libraryDependencySchemes ++= Seq( "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always )
    
© www.soinside.com 2019 - 2024. All rights reserved.