2013-07-25 58 views
34

我聽說.sbt文件在0.13中以各種方式得到了改進,現在我可以在其中指定多項目編譯。在sbt中使用.sbt文件編寫多項目編譯的習慣方式0.13

http://www.scala-sbt.org/0.13.0/docs/Community/ChangeSummary_0.13.0.html#sbt-format-enhancements提到我們現在可以在.sbt文件中定義子項目。我也知道根中的多個.sbt文件將被聚合成一個概念文件。

但是,我真的很喜歡的是不污染我的根與十幾個子項目.sbt文件。有沒有一種方法可以將子項目build.sbt文件放入其各自的子目錄中,在它們之間保留共享的一些通用代碼,然後爲整個子項目的整個項目建立一個root build.sbt?我現在在.scala文件中有一個類似的設置,但如果可能的話,寧願使用.sbt文件。

如果這不可行,那麼使用.sbt文件構建大型多項目構建的「正確」方法是什麼?

回答

23

在0.12中應該已經是這種情況,您可以將.sbt文件放在子項目的基礎目錄中,並且其設置將包含在該項目的範圍內。

通過在project/中創建正常的.scala文件,在.sbt文件之間重新使用該代碼。 project/中的代碼將可用於.sbt文件。其他.sbt文件對一個.sbt中的定義不可見,至少在0.13。這主要是一個實施限制,未來版本中是否會取消這個限制是不確定的。

默認根項目將聚合所有子項目,包括那些來自subProject/build.sbt中定義的項目的子項目。

目前的困難在於明確。 例如,根目錄中的以下build.sbt將定義sub/中的子項目。 這是一個完整的定義,爲項目定義ID,基本目錄等等。

<root>/build.sbt

lazy val sub = project 

但是,它不能引用<sub>/build.sbt定義的東西。 (中sub/build.sbt的存在是不知道,直到後<root>/build.sbt編譯和評估。) 因此,明確界定什麼sub聚集,你需要這樣的:

sub/build.sbt

lazy val sub = project.in(file(".")).aggregates(subSub) 
//or: lazy val sub = project in file(".") aggregate subSub 

lazy val subSub = project 

然而,這種重複sub的定義。

一種可能的解決前進是讓根定義只是一個參考,比如:

<root>/build.sbt

lazy val sub = LocalProject("sub") 
+0

至於0.13,我可以在一個名.bst文件中添加項目定義雖然。如果我將這樣的項目值放在'subproject1/build.sbt'中,並且想要定義一個聚合子項目構建的根項目,該怎麼辦?如果值在.sbt文件之間不可見,則聚合或創建跨子項目依賴關係似乎很棘手。 –

+0

爲了澄清,我的最終目標是儘可能多地劃分子項目,並儘量減少常見.scala文件中需要執行的代碼數量。我一定要保留子項目之間的一些通用代碼,但希望它們儘可能地獨立。 –

+0

已更新,以解決您的意見。指出的可能解決方案並未實施,只是一個概念上的解決方案 –