您可以在支持Gradle的IDE中打开此示例。 |
在分层多仓库项目中运用复合构建
此示例演示了如何使用复合构建来开发一个由不同 Git 仓库组成的分层项目。与多项目构建中的 Gradle 子项目不同,此示例使用包含在复合构建中的独立 Gradle 构建。
除了多仓库架构的优点之外,以这种方式使用 Gradle 复合构建允许开发人员轻松选择哪些模块作为源依赖项进行开发,哪些通过二进制仓库集成。
使用来自包含构建的依赖项运行 multirepo-app
在第一个例子中,所有必需的依赖项都作为构建存在于 modules
目录中。在实际示例中,这些很可能是不同 Git 仓库的克隆。
为了避免硬编码要加载的包含构建,multirepo-app
中的 settings.gradle
文件动态加载了这些构建。
file("modules").listFiles().forEach { moduleBuild: File ->
includeBuild(moduleBuild)
}
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
中定义如下:
tasks.register("publishDeps") {
dependsOn(gradle.includedBuilds.map { it.task(":publishMavenPublicationToMavenRepository") })
}
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