您可以在支援 Gradle 的 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

而 'dependencies' 報告顯示了依賴關係替換的實際效果

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 依賴關係現在從儲存庫解析。

'dependencies' 報告顯示了依賴關係替換的實際效果

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