2016-12-22 43 views
0

我試圖建立一個多項目的建設,像這樣:只作相關文件的更改觸發多項目執行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) 

正如你所看到的,indexerapi都依賴於common而不是彼此。問題是,如果我嘗試了做任務觸發執行,說compile

sbt ~api/compile 

然後在indexer項目更改文件,該項目仍然會重新編譯即使該文件改變實際上不是它classpath - 似乎watchSources總是由根build.sbt引用的每個項目組成,並且不會將實際運行任務的項目考慮在內。

我試過篩選watchSources但是很難做得很整齊,因爲我放入的build.sbt文件只能看到它所在項目的資源。 watchSourcesindexer/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

回答

1

~運營商監視當前活動項目的變化。先嚐試運行project api

> project api 
> ~compile