Gradle 中的多项目构建
Gradle 支持多项目构建,以实现项目的快速开发。 它有助于模块化项目。 它使我们能够专注于更大项目的一个模块。 Gradle 负责处理项目其他部分产生的依赖关系。
多项目构建由一个根项目和一个或多个子项目组成。
跨项目配置
每个子项目都能够在与其他子项目完全隔离的情况下进行自我配置,因此这些子项目具有共同的特征。 最好在项目之间共享配置,这样相同的配置可以影响多个子项目。
配置和执行
在 Gradle 中,配置意味着执行项目的“build.gradle”。 默认情况下,配置是在任何任务执行之前完成的。 当请求来自项目的单个任务时,首先配置多项目构建。 配置项目后,在访问和更新 Gradle 项目的任何模块时变得更加灵活。
创建多项目
让我们创建一个包含其子项目的项目并构建 Gradle 项目。
配合下面的项目结构,其中根项目名称为 Multi_Project,子项目名称为sub_project。
创建一个新的根目录,我们要在其中创建一个多项目。 使用以下命令创建一个新目录:
$ mkdir Multi_Project
创建一个 Gradle 构建; Multi_Project 目录。 要创建 Gradle 构建,请运行 gradle init
命令。 init 命令包含 wrapper 命令本身,因此它将在根项目中创建 build.gradle 和 setting.gradle 文件。
下面是创建 Gradle 项目的过程:
当我们执行 init 命令时,它会询问我们要生成的项目类型。 它提供了四种类型的项目选项。 它们如下:
- Basic
- Application
- Library
- Gradle plugin
选择所需的选项并按回车键继续。
接下来,它会询问我们所需的构建脚本 DSL。 DSL 有两个可用选项:
- Groovy
- Kotlin
选择必要的 DSL 并按 ENTER 键继续。
现在它会询问我们项目名称; 我们可以提供任意项目名,如果不提供,默认以目录名作为项目名。
按 ENTER 键继续。输出结果如下:
然后新建 sub_project
$ mkdir sub_project
现在创建的 multi_project 的目录结构如下:
现在要创建一个多项目构建,在根项目构建脚本(即 build.gradle)中添加以下代码片段。
Closure cl = { task -> println "I'm $task.project.name" }
task('hello').doLast(cl)
project(':sub_project') {
task('hello').doLast(cl)
}
将子项目包含到根项目中。 为此,请在 setting.gradle 中添加以下语句:
rootProject.name = 'multi_project'
include 'sub_project'
使用以下命令执行它:
$ gradle -q hello
执行结果如下
在 Gradle 中,可以从多项目构建的构建脚本中访问任何项目。 Gradle 的项目 API 提供了一个名为 project()
的方法; 它将路径作为参数并返回当前路径的项目对象。 当项目构建从构建脚本进行配置时,称为跨项目配置。 这是使用配置注入实现的。
考虑另一种情况。 在项目 sub_project 下还有另一个名为 Demo 的子项目。 Gradle 项目的树形结构如下:
我们可以从根项目执行所有子项目。 为此,请重写根项目的构建脚本。 将以下代码片段添加到根项目的 build.gradle 文件中:
allprojects {
task hello {
doLast { task ->
println "I'm $task.project.name"
}
}
}
将子项目包含到根项目中。 为此,请在 setting.gradle 中添加以下语句:
rootProject.name = 'multi_project'
include 'sub_project', 'Demo'
使用以下命令执行它;
$ gradle -q hello
执行结果如下所示
仅访问子项目
Gradle 项目 API 还提供了一个仅用于访问子项目的属性。
定义常见行为:
我们可以定义项目和子项目的共同行为。 为此,请重写根项目构建脚本,如下所示:
allprojects {
task hello {
doLast { task ->
println "I'm $task.project.name"
}
}
}
subprojects {
hello {
doLast {
println "- I depend on Multi_project"
}
}
}
使用以下命令执行它:
$ gradle -q hello
添加特定行为
我们可以在常见行为之上添加特定行为。 通常,我们将特定于项目的行为放在要添加特定功能的项目的构建脚本中。 为此,我们必须更新该特定项目的构建脚本。 要将特定行为添加到子项目,请更新构建脚本,如下所示:
allprojects {
task hello {
doLast { task ->
println "I'm $task.project.name"
}
}
}
subprojects {
hello {
doLast {
println "- I depend on multi_project"
}
}
}
project(':sub_project').hello {
doLast {
println "- I contain the project's submodule."
}
}
使用以下命令执行它:
$ gradle -q hello