我試圖建立一個多項目的建設,像這樣:只作相關文件的更改觸發多項目執行SBT建立
+-- common
| +-- build.sbt
+-- api
| +-- build.sbt
+-- indexer
| +-- build.sbt
+-- build.sbt
build.sbt
根看起來像這樣:
lazy val common = (project in file("common"))
lazy val searchApi = (project in file("search"))
.dependsOn(common)
lazy val indexer = (project in file("indexer"))
.dependsOn(common)
正如你所看到的,indexer
和api
都依賴於common
而不是彼此。問題是,如果我嘗試了做任務觸發執行,說compile
:
sbt ~api/compile
然後在indexer
項目更改文件,該項目仍然會重新編譯即使該文件改變實際上不是它classpath - 似乎watchSources
總是由根build.sbt
引用的每個項目組成,並且不會將實際運行任務的項目考慮在內。
我試過篩選watchSources
但是很難做得很整齊,因爲我放入的build.sbt
文件只能看到它所在項目的資源。 watchSources
在indexer/build.sbt
只能看到indexer
,build.sbt
裏面的根目錄只在根目錄下看到src/main/resources
(它看不到watchSources
的子項目)。
有沒有人有解決這個問題的好方法。我已經得到了最好是把這樣的事情在每一個子項目的build.sbt
...
watchSources <<= (watchSources) map { files =>
if (Option(System.getProperty("project")).getOrElse("none").equals("indexer")) {
files
} else {
Nil
}
}
...然後運行sbt -Dproject=indexer ~indexer/compile
。