按需配置会尝试仅配置请求任务相关的项目,即只评估参与构建的项目的构建脚本文件。这样可以减少大型多项目构建的配置时间。

按需配置功能目前处于 孵化阶段,因此仅保证部分构建能正常工作。此功能适用于 解耦 的多项目构建。

在按需配置模式下,项目的配置方式如下

  • 根项目始终会被配置。

  • 构建执行所在目录中的项目也会被配置,但仅限于在执行 Gradle 时未指定任何任务的情况下。
    这样,在按需配置项目时,默认任务可以正常工作。

  • 支持标准项目依赖关系,并且会配置相关的项目。
    如果项目 A 对项目 B 有编译依赖,那么构建 A 会导致两个项目都被配置。

  • 支持通过任务路径声明的任务依赖关系,并会配置相关的项目。
    示例:someTask.dependsOn(":some-other-project:someOtherTask")

  • 通过命令行(或 Tooling API)通过任务路径请求的任务,会导致相关的项目被配置。
    例如,构建 project-a:project-b:someTask 会导致配置 project-b

启用 configuration-on-demand

您可以使用 --configure-on-demand 标志或将 org.gradle.configureondemand=true 添加到 gradle.properties 文件来启用按需配置。

要在每次构建运行时都启用按需配置,请参阅 Gradle 属性

要为特定的构建启用按需配置,请参阅 命令行性能优化选项

解耦项目

Gradle 允许项目在配置和执行阶段相互访问配置和任务。虽然这种灵活性赋予了构建作者能力,但也限制了 Gradle 进行优化(例如 并行项目构建按需配置)的能力。

当项目仅通过声明的依赖和任务依赖进行交互时,它们被认为是解耦的。任何直接修改或读取另一个项目的对象都会在项目之间产生耦合。配置阶段的耦合在使用“按需配置”时可能导致构建结果错误,而执行阶段的耦合会影响并行执行。

一种常见的耦合源是配置注入,例如在构建脚本中使用 allprojects{}subprojects{}

为了避免耦合问题,建议

  • 避免引用其他子项目的构建脚本,并优先使用从根项目进行的 跨项目配置

  • 避免在执行期间动态更改其他项目的配置。

随着 Gradle 的发展,它旨在提供利用解耦项目的功能,同时为配置注入等常见用例提供解决方案,而不会引入耦合。

并行项目

Gradle 的并行执行功能通过并发执行不同项目中的任务来优化 CPU 利用率,从而加速构建。

要启用并行执行,请使用 --parallel 命令行参数 或配置您的 构建环境。Gradle 会根据 CPU 核心数自动确定最佳并行线程数。

在并行执行期间,每个 worker 仅负责一个特定项目。任务依赖会得到遵守,worker 会优先执行上游任务。然而,任务可能不会像顺序模式那样按字母顺序执行。正确声明任务依赖以及输入/输出对于避免顺序问题至关重要。