如何覆盖sbt插件的依赖?

Esk*_*ola 24 plugins dependency-management sbt

我写称为SBT插件SBT-JUMI它实现了SBT集成JUMI.现在sbt-jumi插件取决于当前的Jumi版本.

这是插件的build.sbt中的相关行:

libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.5.376"
Run Code Online (Sandbox Code Playgroud)

插件的用户会将此添加到他的project/plugins.sbt文件中:

addSbtPlugin("fi.jumi.sbt" % "sbt-jumi" % "0.1.0")
Run Code Online (Sandbox Code Playgroud)

现在让我们说Jumi 0.6.400已经发布,它向后兼容.sbt-jumi插件的用户如何配置它使用Jumi 0.6.400,而不必发布新版本的插件?

以下是在Maven中如何做到这一点.但是如何在sbt中做到这一点?

Esk*_*ola 36

覆盖插件的依赖关系与覆盖正常依赖关系的方式相同,只是必须输入配置project/plugins.sbt.库管理中解释了覆盖依赖项.以下是摘要:

如果您希望使用的版本大于您可以传递的依赖项,则默认情况下sbt将使用较大的版本.您可以更改冲突管理器以更改默认行为 - 例如,这将在冲突时创建错误:

conflictManager := ConflictManager.strict
Run Code Online (Sandbox Code Playgroud)

换句话说,这project/plugins.sbt将工作:

libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.6.400"
Run Code Online (Sandbox Code Playgroud)

您可以使用reload plugins然后检查插件依赖项show update.它现在应该将旧版本显示为"(EVICTED)".

如果您要使用的版本低于默认依赖项,则需要以不同方式覆盖.一种方法是强制依赖:

libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.4.350" force()
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用dependencyOverrides设置:

dependencyOverrides += "fi.jumi" % "jumi-launcher" % "0.4.350"
Run Code Online (Sandbox Code Playgroud)

两种方法之间的区别在于覆盖不会引入直接依赖.我不认为插件的差异很重要,但对于已发布的工件,它有一些差异.