我的build.sbt
文件中有以下代码行:
libraryDependencies ++= Seq("com.foo" %% "lib" % "1.2.3")
想象一下,该库依赖于“ com.bar.lib”库。现在,在我的代码中,我可以import com.bar.lib._
,它将起作用。但是我不想编译它,所以也许有专门用于此目的的SBT插件?
我正在使用的一个库取决于旧的cats
版本。我花了很长时间了解为什么mapN方法不起作用...我从未在子项目中导入过较新版本的cats。
答案 0 :(得分:1)
@earldouglas指出,SBT提供了intransitive
和exclude
功能来解决此类问题。参见:https://www.scala-sbt.org/1.x/docs/Library-Management.html
您回答:
我试图这样做,但是intransitive()不会导入可传递的依赖项(因此我需要手工导入所有它们以进行编译)。
是的,这就是它的目的
我想要的东西会警告我有关使用未直接导入SBT文件中的库的情况。
因此,您想要对类路径的可传递依赖关系,但希望编译器拒绝在项目代码中使用可传递类,而在库代码中允许它们使用?
这不是明智的方法:在运行时,这些可传递依赖项将位于类路径上。 JVM类路径不能区分不同类型的依赖项;这种区别仅在构建时存在于SBT中。
任一个
包括cats
库的较新版本,覆盖了传递性dep或
,如果传递的cats
库已损坏,则将其排除。
但是,我认为您可以通过在不同的构建阶段设置不同的依赖项来实现所需的目标:
Compile
阶段,将依赖项包含在intransitive
中。您的代码应针对直接依赖项进行编译,但是如果您引用了任何传递性依赖项,则会失败Runtime
阶段,将依赖项及其可传递部门包括在内SBT代码可能看起来像这样(未经测试):
(libraryDependencies in Compile) ++= Seq("com.foo" %% "lib" % "1.2.3" intransitive())
(libraryDependencies in Runtime) ++= Seq("com.foo" %% "lib" % "1.2.3")