2016-02-18 131 views
3

我有一个多项目包含一个私有宏子项目,它的用途仅限于实现其他子项目的方法体。它也不应该在其他子项目的运行时类路径中,也不应该在其他子项目的已发布POM中以任何形式显示。因此,其他sbt项目可以在不知道宏子项目的情况下使用该项目的库。在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") 

回答

3

该错误是因为该项目没有该配置。

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容器)在类路径上提供,但不在编译时提供。

+0

的'compile'任务失败。在编译'lib'时,它无法在'macro'项目中找到任何类。 – Steiny

3
val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal") 

昨晚刚把这个讨论...当我用这个办法

相关问题