【问题标题】:Add a compile time only dependency in sbt在 sbt 中添加仅编译时依赖项
【发布时间】:2014-02-26 05:29:25
【问题描述】:

我想向一个仅用于编译的 sbt 项目添加一个依赖项。它也不应该在运行时类路径上,也不应该在已发布的 POM 中以任何形式可见。

这个想法是添加一个仅存根的库 (OrangeExtensions),以便项目可以在任何平台上编译,而不仅仅是 OS X。

有没有可能是这样的:

libraryDependencies += "com.yuvimasory" % "orange-extensions" % "1.3.0" % ???

?

【问题讨论】:

  • 如果你的代码依赖于OrangeExtensions(没有它就无法编译),我会说它在运行时也是必需的。
  • @RadoBuransky OrangeExtensions 只是 Apple 在 OS X 上由 Java 提供的库的存根版本。当不在 Mac 上时,我围绕它设计的 API 不会调用这个 API。为了在非 Mac 上编译项目,您需要存根。显然存根只是一个编译帮助。
  • 您可以使用“provided”,但它会显示出来。

标签: scala maven sbt dependency-management


【解决方案1】:

您可以为此创建一个自定义dependency configuration(实际上,当您在项目中使用私有宏时,这变得非常普遍,我希望 SBT 提供一个)。

build.sbt:

// a 'compileonly' configuation
ivyConfigurations += config("compileonly").hide

// some compileonly dependency
libraryDependencies += "commons-io" % "commons-io" % "2.4" % "compileonly"

// appending everything from 'compileonly' to unmanagedClasspath
unmanagedClasspath in Compile ++= 
  update.value.select(configurationFilter("compileonly"))

该依赖不会出现在publish和朋友生成的pom.xml中。

几乎有这样的配置可用:provided 配置。除了provided 最终在pom.xml 中作为provided 范围的依赖项。另外,provided 的意思是“运行时本身在运行时提供这个”,而不是“在运行时不需要这个”。

【讨论】:

  • 这不适用于我使用 'dependsOn(macrosProject % "compileonly")' 的 SBT 宏项目(否则 as per the docs)。有什么想法为什么不呢?子项目在编译时不可用。
  • 在使用宏工作时,这适用于我的某些库(scala-reflections),但不适用于其他库(snakeyaml)。我不知道为什么,但我最终使用 pomPostProcess 来绕过落后者,请参阅:(stackoverflow.com/a/13880582/455581)。希望这可以帮助其他人在排除此类时被编译时错误阻塞。
  • 注意 sbt1.0 需要一个大写的配置项。使用 ` val CompileOnly = config("compileonly"); ivyConfigurations += CompileOnly.hide;` 见:stackoverflow.com/a/35486527/622016
猜你喜欢
  • 2016-05-30
  • 2016-04-05
  • 2021-11-11
  • 2015-01-24
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多