您可以使用 IntelliJ 原生匯入器Eclipse Buildship 在 IDE 內開啟此範例。

在階層式多儲存庫專案中使用複合建置

此範例說明如何使用複合建置開發由不同 Git 儲存庫組成的階層式專案。此範例使用包含在複合建置中的個別 Gradle 建置,而非多專案建置中的 Gradle 子專案。

除了多儲存庫架構的優點外,使用 Gradle 複合建置的方式讓開發人員可以輕鬆選擇要作為來源相依性開發的模組,以及要透過二進位儲存庫整合的模組。

使用包含建置中的相依性執行 multirepo-app

在第一個執行個體中,所有必要的相依性都存在於 modules 目錄中的建置中。在真實世界的範例中,這些建置很可能是不同 Git 儲存庫的複製。

為了避免硬編碼要載入的內含建置,multirepo-app 中的 settings.gradle 檔案會動態載入每個建置

settings.gradle.kts
file("modules").listFiles().forEach { moduleBuild: File ->
    includeBuild(moduleBuild)
}
settings.gradle
file('modules').listFiles().each { File moduleBuild ->
    includeBuild moduleBuild
}

執行 multirepo-app 建置時,這些模組建置會用於產生相依的成品

gradle run

而「相依關係」報告會顯示相依關係替換的實際狀況

gradle app:dependencies --configuration runtimeClasspath
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.sample:number-utils:1.0 -> project :number-utils
\--- org.sample:string-utils:1.0 -> project :string-utils
     \--- org.apache.commons:commons-lang3:3.12.0

切換為使用二進位相依關係

只要模組在二進位儲存庫中可用,即使您沒有在本地端提供部分模組,multirepo-app 建置仍會持續運作。在這種情況下,Gradle 會使用從儲存庫下載的二進位相依關係。

準備二進位儲存庫

為了示範此功能,我們首先需要將每個模組發布到二進位儲存庫。在這種情況下,我們使用本機檔案儲存庫來達成此目的

gradle :publishDeps

publishDeps 會建立並上傳每個內含建置的成品。它在 multirepo-app 中定義如下

build.gradle.kts
tasks.register("publishDeps") {
    dependsOn(gradle.includedBuilds.map { it.task(":publishMavenPublicationToMavenRepository") })
}
build.gradle
tasks.register('publishDeps') {
    dependsOn gradle.includedBuilds*.task(':publishMavenPublicationToMavenRepository')
}

移除本機模組來源

在儲存庫中提供模組成品後,我們現在可以從建置中移除模組來源。由於複合式建置已設定為自動載入可用的模組,因此這就像刪除一個或多個模組目錄一樣簡單。

rm -r modules/string-utils
gradle run

請注意,number-utils 相依關係仍由內含建置滿足,而 string-utils 相依關係現在從儲存庫中解析。

「相依關係」報告會顯示相依關係替換的實際狀況

gradle app:dependencies --configuration runtimeClasspath
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.sample:number-utils:1.0 -> project :number-utils
\--- org.sample:string-utils:1.0
     \--- org.apache.commons:commons-lang3:3.12.0

將外部函式庫納入為子模組

此組態的效能可以在將外部「commons-lang」建置直接新增到複合式建置時獲得驗證。

git clone http://gitbox.apache.org/repos/asf/commons-lang.git modules/commons-lang --branch rel/commons-lang-3.12.0 --depth 1
gradle --project-dir modules/commons-lang init
gradle run

您可以執行以下動作,查看外部傳遞相依關係 commons-lang 已被本機專案相依關係取代

gradle app:dependencies --configuration runtimeClasspath