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

时间:2016-02-18 09:48:43

标签: scala sbt dependency-management 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")

2 个答案:

答案 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") 

昨晚刚刚进行了这次讨论......