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

Scala 禁止使用自动导入依赖项的SBT插件,scala,sbt,Scala,Sbt,我的build.sbt文件中有这行代码: libraryDependencies ++= Seq("com.foo" %% "lib" % "1.2.3") 假设这个库依赖于“com.bar.lib”库。现在在我的代码中,我可以导入com.bar.lib.\u并且它会工作。但我不想编译这个,所以可能有SBT插件就是为了这个目的 我使用的一个库依赖于旧的cats版本。我花了很长时间来理解为什么mapN方法不起作用。。。我只是从来没有在子项目中导入过更新版本的cats。SBT提供了不及物和排除功能

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

libraryDependencies ++= Seq("com.foo" %% "lib" % "1.2.3")
假设这个库依赖于“com.bar.lib”库。现在在我的代码中,我可以
导入com.bar.lib.\u
并且它会工作。但我不想编译这个,所以可能有SBT插件就是为了这个目的


我使用的一个库依赖于旧的
cats
版本。我花了很长时间来理解为什么mapN方法不起作用。。。我只是从来没有在子项目中导入过更新版本的cats。

SBT提供了
不及物
排除
功能来处理此类问题,正如@earldouglas指出的那样。见:

你回答说:

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

是的,这就是它的目的

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

因此,您希望类路径上存在可传递依赖项,但希望编译器拒绝在项目代码中使用可传递类,同时允许它们在库代码中使用

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

两种选择中的任何一种都会为你提供更好的服务

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

  • 排除传递包含的
    cats
    库(如果已损坏)

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

  • Compile
    阶段,使用
    intransitive
    包含依赖项。您的代码应该针对直接依赖项进行编译,但如果您引用了任何可传递依赖项,则会失败
  • 运行时
    阶段,包括依赖项及其可传递的dep
  • SBT代码可能如下所示(未测试):


    您是否尝试过使用
    不及物
    排除
    ?请参阅:我尝试过这样做,但是
    intransitive()
    不导入可传递依赖项(因此我需要手动导入所有依赖项以使其可编译)。我想要的是警告我不要使用SBT文件中未直接导入的库。
    (libraryDependencies in Compile) ++= Seq("com.foo" %% "lib" % "1.2.3" intransitive())
    (libraryDependencies in Runtime) ++= Seq("com.foo" %% "lib" % "1.2.3")