【问题标题】:How to override the dependency of an sbt plugin?如何覆盖 sbt 插件的依赖关系?
【发布时间】:2013-08-06 14:55:16
【问题描述】:

我编写了一个名为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,而无需我发布新版本的插件?

Here is how to do it in Maven. 但是在 sbt 中怎么做呢?

【问题讨论】:

    标签: plugins sbt dependency-management


    【解决方案1】:

    覆盖插件的依赖与覆盖普通依赖的方式相同,只是配置必须输入project/plugins.sbtLibrary Management 中解释了覆盖依赖项。总结如下:

    如果您希望使用的版本大于,则默认情况下,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"
    

    这两种方法的区别在于覆盖不会引入直接依赖。我认为插件的区别并不重要,但对于已发布的工件,它有some differences

    【讨论】:

    • 这是我遇到并想分享的一个问题:第 0 天:该插件的当前在线发布版本0.3 | day1:我在本地发布了我的开发中插件,版本为0.4,并在本地存储库中引用了这个插件 |第 2 天:插件在互联网官方 repo 上发布,版本为0.4第 3 天:我的插件不再符合我的预期,因为 sbt 加载了两个插件,但决定从互联网上获取一个。为了解决这个问题,我不得不将我的版本更改为0.5,然后它就可以工作了。
    • 我怎样才能完全排除一个sbt插件的依赖?
    • OK 发现自己:在build.sbt 中添加excludeDependencies,参见github.com/mkurz/coursier-excludedependencies-sbtplugin/blob/…。但是请注意,如果您使用 coursier,则存在一个错误,因此它还不能工作:github.com/coursier/coursier/issues/1590
    猜你喜欢
    • 2021-03-25
    • 2014-12-18
    • 1970-01-01
    • 2014-01-12
    • 2013-01-04
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多