您可以在 IDE 中使用 IntelliJ 原生导入器 或 Eclipse Buildship 打开此示例。 |
在分层多仓库项目中使用组合构建
此示例演示了如何使用组合构建来开发由不同 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