configuration-on-demand 嘗試僅設定與所要求任務相關的專案,亦即,它只評估參與建置的專案建置指令碼檔案。如此一來,大型多專案建置的設定時間便可縮短。
configuration-on-demand 功能為孵化中,因此僅保證部分建置能正確運作。此功能適用於解耦的多專案建置。
在 configuration-on-demand 模式中,專案設定如下
-
根目錄專案總是會設定。
-
執行建置的目錄中的專案也會設定,但僅在 Gradle 在沒有任何任務的情況下執行時。
如此一來,當專案依需求設定時,預設任務才能正確運作。 -
支援標準專案相依性,並設定相關專案。
如果專案 A 對專案 B 有編譯相依性,則建置 A 會導致兩個專案的設定。 -
透過任務路徑宣告的任務相依性受到支援,並導致相關專案被設定。
範例:someTask.dependsOn(":some-other-project:someOtherTask")
-
透過命令列(或工具 API)從任務路徑要求的任務會導致相關專案被設定。
例如,建置project-a:project-b:someTask
會導致project-b
的設定。
解耦的專案
Gradle 允許專案在設定和執行階段存取彼此的設定和任務。雖然這種彈性賦予建置作者權限,但它限制了 Gradle 執行最佳化作業的能力,例如 平行專案建置 和 on-demand 設定。
當專案僅透過宣告的相依性和任務相依性進行互動時,它們就被視為解耦。直接修改或讀取另一個專案的物件會在專案之間建立耦合。在設定期間的耦合可能會在使用「on-demand 設定」時導致有瑕疵的建置結果,而執行期間的耦合可能會影響平行執行。
耦合的一個常見來源是設定注入,例如在建置指令碼中使用 allprojects{}
或 subprojects{}
。
若要避免耦合問題,建議您
-
避免參照其他子專案的建置指令碼,並優先從根專案進行跨設定。
-
避免在執行期間動態變更其他專案的設定。
隨著 Gradle 的演進,它旨在提供能利用解耦專案的功能,同時提供常見使用案例的解決方案,例如注入組態,而不會引入耦合。