2012-07-25 445 views
48

我有以下Scala的應用程序的設置和一個共同的核心庫: 根如何從其他sbt項目引用外部sbt項目?

-> /ApplicationA 
    -> /project 
    -> /build.sbt 
-> /CoreLibrary 
    -> /project 
    -> /build.sbt 

我想從ApplicationA添加引用CoreLibrary點菜Eclipse項目的參考,讓每一位CoreLibrary改變ApplicationA時間也建造。從來就試圖build.Scala爲ApplicationA以下內容:

val core = Project(
     id = "platform-core", 
     base = file("../CoreLibrary")) 

    val main = Project(id = "application, base = file(".")).dependsOn(core) 

然而,編譯時ApplicationA SBT抱怨的依賴只能是一個子目錄!!:

java.lang.AssertionError: assertion failed: Directory C:\git\CoreLibrary is not contained in build root C:\git\ApplicationA 

這似乎完全是簡單,這個項目依賴性的正確方法是什麼?

回答

41

你可以做你的項目一樣,源依賴性:

lazy val core = RootProject(file("../CoreLibrary")) 

val main = Project(id = "application", base = file(".")).dependsOn(core) 

我有一個多模塊發揮構建一個工作示例:https://github.com/ahoy-jon/play2MultiModule/blob/master/playapp/project/Build.scala

但我認爲適當的方式(這取決於你的上下文)是創建一個

-> /project/ 
    -> Build.scala 
-> /ApplicationA 
    -> /project 
    -> /build.sbt 
-> /CoreLibrary 
    -> /project 
    -> /build.sbt 

引用兩個項目和它們之間的依賴關係。

+0

第一種方法完美運作!謝謝!必須使用RootProject :) 第二種方法的問題是它們是2 github回購,所以爲了讓它們工作,您需要額外的一個在頂部或東西 – Diego 2012-07-25 16:28:21

+1

@Diego請參閱git submodule以獲得單獨的git在單一外部git回購下回購。 – 2012-07-25 22:22:52

+3

所謂的「正確的方式」是IMO的一個不好的解決方案。您不應該需要容器項目來聲明兩個兄弟之間的依賴關係。 – 2013-01-31 10:04:17

19

隨着SBT 0.12.1似乎可以得到一個簡單的參考項目:

我用ProjectRef代替RootProject

http://www.scala-sbt.org/0.12.1/api/sbt/ProjectRef.html

ProjectRef(file("../util-library"), "util-library") 

SBT-日食也適用。

+0

優秀!但只有當子項目使用相同版本的Scala時纔有效。 – 2017-10-02 23:58:38

11

由於sbt 0.13,您可以直接在.sbt中創建多項目定義,而不需要Build.scala文件。

因此,將以下內容添加到ApplicationA/project/build.sbt就足夠了。

lazy val core = RootProject(file("../CoreLibrary")) 

val main = Project(id = "application", base = file(".")).dependsOn(core)