Chi*_*kei 6 scala dependency-management sbt scala-macros
我有一个多项目包含一个私有宏子项目,其用途仅限于实现其他子项目的方法体.也不应该在其他子项目的运行时类路径上,也不应该在其他子项目的已发布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")
Run Code Online (Sandbox Code Playgroud)
该错误是因为项目没有该配置.
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)
Run Code Online (Sandbox Code Playgroud)
但问题是
macro#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)
Run Code Online (Sandbox Code Playgroud)
您可能还想熟悉provided配置.它是一个标准的Maven/Ivy配置,这意味着jar将在运行时在类路径上提供(例如像JDK或servlet容器),但不能在编译时提供.
val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal")
Run Code Online (Sandbox Code Playgroud)
昨晚刚讨论过这个...