Plugins 如何覆盖sbt插件的依赖关系?

Plugins 如何覆盖sbt插件的依赖关系?,plugins,sbt,dependency-management,Plugins,Sbt,Dependency Management,我已经编写了一个名为的sbt插件,它为实现sbt集成。现在sbt jumi插件取决于当前的jumi版本 以下是插件的相关行: 插件的用户会将此添加到他的项目/plugins.sbt文件中: addSbtPlugin("fi.jumi.sbt" % "sbt-jumi" % "0.1.0") 现在让我们假设JUMI0.6.400已经发布,并且它是向后兼容的sbt jumi插件的用户如何配置它使用jumi 0.6.400,而无需我发布新版本的插件? 但是如何在sbt中实现呢?覆盖插件的依赖项与覆盖

我已经编写了一个名为的sbt插件,它为实现sbt集成。现在sbt jumi插件取决于当前的jumi版本

以下是插件的相关行:

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

addSbtPlugin("fi.jumi.sbt" % "sbt-jumi" % "0.1.0")
现在让我们假设JUMI0.6.400已经发布,并且它是向后兼容的sbt jumi插件的用户如何配置它使用jumi 0.6.400,而无需我发布新版本的插件?


但是如何在sbt中实现呢?

覆盖插件的依赖项与覆盖正常依赖项的方式相同,只是配置必须输入到
项目/plugins.sbt
。中介绍了重写依赖项。以下是总结:

如果您希望使用的版本大于通过传递获得的依赖项,sbt将默认使用较大的版本。您可以更改冲突管理器以更改默认行为-例如,这将在冲突中创建错误:

conflictManager := ConflictManager.strict
换句话说,
project/plugins.sbt
中的这一点可以工作:

libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.6.400"
您可以使用
重新加载插件
然后
显示更新
来检查插件依赖关系。它现在应该将旧版本显示为“(收回)”

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

libraryDependencies += "fi.jumi" % "jumi-launcher" % "0.4.350" force()
另一种方法是使用
dependencyOverrides
设置:

dependencyOverrides += "fi.jumi" % "jumi-launcher" % "0.4.350"

这两种方法之间的区别在于重写不会引入直接依赖关系。我不认为插件之间的区别很重要,但是对于发布的工件,它已经发布了。

我得到了一个问题,我想与大家分享:第0天:插件的当前在线发布版本
0.3
;第1天:我在本地发布版本为
0.4
的开发中插件,并在本地存储库中引用该插件|第2天:插件发布版本为
0.4
互联网官方回购第3天:我的插件不再像我期望的那样,因为sbt加载了两个插件,但决定从互联网上获取一个。为了解决这个问题,我不得不将我的版本更改为
0.5
,然后它就工作了。我如何才能完全排除sbt插件的依赖关系?好的,我自己发现了:在
build.sbt
中添加
excludeDependencies
,请参阅。但是,请注意,如果您使用coursier,则存在一个bug,因此它还不能工作:
dependencyOverrides += "fi.jumi" % "jumi-launcher" % "0.4.350"