持续构建允许您在文件输入更改时自动重新执行请求的任务。您可以使用 -t--continuous 命令行选项在此模式下执行构建。

例如,您可以连续运行 test 任务和所有依赖任务,通过运行

$ gradle test --continuous

Gradle 的行为将如同您在更改了对请求任务有贡献的源文件或测试后运行了 gradle test。这意味着不相关的更改(例如对构建脚本的更改)不会触发重新构建。要合并构建逻辑更改,必须手动重启持续构建。

持续构建使用 文件系统监视 来检测输入的更改。如果文件系统监视在您的系统上不起作用,那么持续构建也无法工作。特别是,当使用 --no-daemon 时,持续构建不起作用。

当 Gradle 检测到输入的更改时,它不会立即触发构建。相反,它会等待一段时间,直到没有检测到其他更改 - 静默期。您可以通过 Gradle 属性 org.gradle.continuous.quietperiod 以毫秒为单位配置静默期。

终止持续构建

如果 Gradle 连接到交互式输入源(例如终端),则可以通过按 CTRL-D 退出持续构建(在 Microsoft Windows 上,还需要在 CTRL-D 后按 ENTERRETURN)。

如果 Gradle 未连接到交互式输入源(例如,作为脚本的一部分运行),则必须终止构建过程(例如,使用 kill 命令或类似命令)。

如果构建是通过 Tooling API 执行的,则可以使用 Tooling API 的取消机制取消构建。

局限性

在某些情况下,持续构建可能无法检测到输入的更改。

创建输入目录

有时,创建先前缺失的输入目录不会触发构建,这是由于文件系统监视的工作方式所致。例如,创建 src/main/java 目录可能不会触发构建。类似地,如果输入是 过滤的文件树 并且没有文件与过滤器匹配,则创建匹配文件可能不会触发构建。

未跟踪任务的输入

更改 未跟踪任务 或没有输出的任务的输入可能不会触发构建。

项目目录外部文件的更改

Gradle 仅监视项目目录内文件的更改。项目目录外部文件的更改将不会被检测到,也不会触发构建。

构建循环

Gradle 在任务执行之前开始监视更改。如果任务在执行时修改了自己的输入,Gradle 将检测到更改并触发新的构建。如果每次任务执行时,输入再次被修改,则构建将再次被触发。这并非持续构建独有。修改自身输入的任务在没有持续构建的“正常”运行中也永远不会被认为是最新的。

如果您的构建进入这样的构建循环,您可以通过查看 Gradle 报告的已更改文件列表来跟踪任务。在识别出每次构建期间更改的文件后,您应该查找将该文件作为输入的任务。在某些情况下,这可能是显而易见的(例如,Java 文件使用 compileJava 编译)。在其他情况下,您可以使用 --info 日志记录来查找由于已识别的文件而过期的任务。

通常,Gradle 不会检测到符号链接或通过符号链接引用的文件的更改。

构建逻辑的更改不被考虑

当前实现不会在后续构建中重新计算构建模型。这意味着对任务配置的更改或对构建模型的任何其他更改实际上都会被忽略。