在 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")
昨晚刚刚讨论过...
我有一个包含私有宏子项目的多项目,它的使用仅限于实现其他子项目的方法体。它既不应该在其他子项目的运行时类路径中,也不应该以任何形式在其他子项目的已发布 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")
昨晚刚刚讨论过...