您可以在 IDE 中使用 IntelliJ 原生导入器Eclipse Buildship 打开此示例。

在分层多仓库项目中使用组合构建

此示例演示了如何使用组合构建来开发由不同 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