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

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)

Pau*_*per 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)
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容器),但不能在编译时提供.


pfn*_*pfn 5

val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal") 
Run Code Online (Sandbox Code Playgroud)

昨晚刚讨论过这个...