2016-02-18 202 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") 

昨晚剛把這個討論...當我用這個辦法

相關問題