持续构建允许您在文件输入发生更改时自动重新执行请求的任务。您可以使用 -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 报告的已更改文件列表来追踪任务。在识别出每次构建期间更改的文件后,你应该寻找具有该文件作为输入的任务。在某些情况下,这可能是显而易见的(例如,使用 compileJava 编译 Java 文件)。在其他情况下,你可以使用 --info 日志记录来查找由于已识别文件而过时的任务。