我有一个多项目包含一个私有宏子项目,其用途仅限于实现其他子项目的方法体。也不应该在其他子项目的运行时类路径上,也不应该在其他子项目的已发布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")
答案 0 :(得分:5)
该错误是因为项目没有该配置。
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_2.10; 0.1-SNAPSHOT:宏中的配置不公开#macro_2.10; 0.1-SNAPSHOT:'compileonly'。需要从lib#lib_2.10; 0.1-SNAPSHOT编译
解决方案是
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容器),但不能在编译时提供。
答案 1 :(得分:4)
val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal")
昨晚刚刚进行了这次讨论......