【问题标题】:SBT plugin to forbid use of auto-imported dependenciesSBT 插件禁止使用自动导入的依赖项
【发布时间】:2018-12-01 18:01:41
【问题描述】:

我的build.sbt 文件中有这行代码:

libraryDependencies ++= Seq("com.foo" %% "lib" % "1.2.3")

想象一下这个库依赖于“com.bar.lib”库。现在在我的代码中我可以import com.bar.lib._ 并且它会工作。但我不希望它编译,所以也许有 SBT 插件就是为了这个目的?

我使用的一个库依赖于旧的 cats 版本。我花了很长时间才明白为什么 mapN 方法不起作用……我只是从未在子项目中导入新版本的猫。

【问题讨论】:

  • 您是否尝试过使用intransitiveexclude?见:scala-sbt.org/1.x/docs/Library-Management.html
  • 我尝试这样做,但intransitive() 不导入传递依赖项(因此我需要手动导入所有这些以使其编译)。我想要的是警告我使用未直接导入 SBT 文件的库。

标签: scala sbt


【解决方案1】:

正如@earldouglas 指出的那样,SBT 提供了intransitiveexclude 功能来处理此类问题。见:https://www.scala-sbt.org/1.x/docs/Library-Management.html

你回复了:

我尝试这样做,但 intransitive() 不导入传递依赖项(因此我需要手动导入所有这些以使其编译)。

是的,这就是它的目的

我想要的是警告我使用未直接导入 SBT 文件中的库。

所以你希望你的类路径上有传递依赖,但是你想让编译器拒绝在你的项目代码中使用传递类,同时允许它们在库代码中使用?

这不是一个明智的方法:在运行时,这些传递依赖项将位于类路径上。 JVM 类路径不区分不同类型的依赖项;这种区别只存在于构建时的 SBT 中。

你会得到更好的服务

  • 包括更新版本的 cats 库,覆盖传递 dep 或

  • 排除传递性包含的 cats 库,如果它已损坏。

但是,我认为您可能可以通过在不同的构建阶段设置不同的依赖项来实现您想要的:

  1. Compile 阶段,包含intransitive 的依赖项。您的代码应该针对您的直接依赖项进行编译,但如果您引用了任何传递依赖项,则会失败
  2. Runtime 阶段,包含依赖项及其传递依赖项

SBT 代码可能如下所示(未经测试):

(libraryDependencies in Compile) ++= Seq("com.foo" %% "lib" % "1.2.3" intransitive())
(libraryDependencies in Runtime) ++= Seq("com.foo" %% "lib" % "1.2.3")

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2014-09-04
    • 2014-05-27
    • 2016-12-11
    • 2016-09-14
    相关资源
    最近更新 更多