在 sbt 中添加仅编译时依赖项
Posted
技术标签:
【中文标题】在 sbt 中添加仅编译时依赖项【英文标题】:Add a compile time only dependency in sbt 【发布时间】:2014-02-26 05:29:25 【问题描述】:我想向一个仅用于编译的 sbt 项目添加一个依赖项。它也不应该在运行时类路径上,也不应该在已发布的 POM 中以任何形式可见。
这个想法是添加一个仅存根的库 (OrangeExtensions),以便项目可以在任何平台上编译,而不仅仅是 OS X。
有没有可能是这样的:
libraryDependencies += "com.yuvimasory" % "orange-extensions" % "1.3.0" % ???
?
【问题讨论】:
如果你的代码依赖于OrangeExtensions(没有它就无法编译),我会说它在运行时也是必需的。 @RadoBuranskyOrangeExtensions
只是 Apple 在 OS X 上由 Java 提供的库的存根版本。当不在 Mac 上时,我围绕它设计的 API 不会调用这个 API。为了在非 Mac 上编译项目,您需要存根。显然存根只是一个编译帮助。
您可以使用“provided”,但它会显示出来。
【参考方案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 来绕过落后者,请参阅:(***.com/a/13880582/455581)。希望这可以帮助其他人在排除此类时被编译时错误阻塞。 注意 sbt1.0 需要一个大写的配置项。使用 ` val CompileOnly = config("compileonly"); ivyConfigurations += CompileOnly.hide;` 见:***.com/a/35486527/622016以上是关于在 sbt 中添加仅编译时依赖项的主要内容,如果未能解决你的问题,请参考以下文章
使用 org.apache.hadoop/* 依赖项离线编译 sbt 的问题
Sbt Plugin 添加依赖到 project/build.sbt
添加 scala-compiler.jar 作为运行时依赖项