在 sbt 中添加仅编译时的子项目依赖

Add a compile time only sub-project dependency in sbt

我有一个包含私有宏子项目的多项目,它的使用仅限于实现其他子项目的方法体。它既不应该在其他子项目的运行时类路径中,也不应该以任何形式在其他子项目的已发布 POM 中可见。这样其他 sbt 项目就可以在不知道宏子项目的情况下使用该项目中的库。

对于外部依赖,我发现这个 SO Q&A 工作得很好,但是对于子项目,当我尝试做与 dependsOn 类似的事情时,sbt 抱怨配置 "compileonly" 没有找到了。

ivyConfigurations += config("compileonly").hide

val macro = Project("macro", file("macro"))

val lib = Project("lib", file("lib")).dependsOn(macro % "compile->compileonly")

该错误是因为该项目没有该配置。

val CompileOnly = config("compileonly").hide    

ivyConfigurations += CompileOnly

val macro = Project("macro", file("macro")).configs(CompileOnly) // add config

val lib = Project("lib", file("lib")).dependsOn(macro % CompileOnly)

但问题是

macro#macro_2.10;0.1-SNAPSHOT: configuration not public in macro#macro_2.10;0.1-SNAPSHOT: 'compileonly'. It was required from lib#lib_2.10;0.1-SNAPSHOT compile

解决方法是

val CompileOnly = config("compileonly")

val macro = Project("macro", file("macro")).configs(CompileOnly)

val lib = Project("lib", file("lib")).dependsOn(macro % CompileOnly)
  .settings(ivyConfigurations += CompileOnly.hide)

您可能还想熟悉 provided 配置。这是一个标准的 Maven/Ivy 配置,这意味着 jar 将在运行时在类路径上提供(例如像 JDK 或 servlet 容器),但不会在编译时提供。

val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal") 

昨晚刚刚讨论过...