SBT插件禁止使用自动导入的依赖项

时间:2018-06-22 09:28:35

标签: scala sbt

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

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

想象一下,该库依赖于“ com.bar.lib”库。现在,在我的代码中,我可以import com.bar.lib._,它将起作用。但是我不想编译它,所以也许有专门用于此目的的SBT插件?

我正在使用的一个库取决于旧的cats版本。我花了很长时间了解为什么mapN方法不起作用...我从未在子项目中导入过较新版本的cats。

1 个答案:

答案 0 :(得分: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")