持续构建允许您在文件输入发生变化时自动重新执行请求的任务。您可以使用 -t
或 --continuous
命令行选项以这种模式执行构建。
例如,您可以通过运行以下命令来持续运行 test
任务及其所有依赖任务
$ gradle test --continuous
Gradle 的行为就像您在更改了对请求的任务有贡献的源文件或测试文件后运行了 gradle test
一样。这意味着不相关的更改(例如构建脚本的更改)不会触发重新构建。要应用构建逻辑的更改,必须手动重启持续构建。
持续构建使用 文件系统监听来检测输入的更改。如果文件系统监听在您的系统上不起作用,那么持续构建也将不起作用。特别是,在使用 --no-daemon
时,持续构建不起作用。
当 Gradle 检测到输入发生更改时,它不会立即触发构建。相反,它会等待一段时间(即静默期),直到不再检测到额外更改。您可以通过 Gradle 属性 org.gradle.continuous.quietperiod
以毫秒为单位配置静默期。
终止持续构建
如果 Gradle 附加到交互式输入源(例如终端),可以通过按 CTRL-D
退出持续构建(在 Microsoft Windows 上,需要在按 CTRL-D
后再按 ENTER
或 RETURN
)。
如果 Gradle 没有附加到交互式输入源(例如作为脚本的一部分运行),则必须终止构建过程(例如使用 kill
命令或类似方式)。
如果构建是通过 Tooling API 执行的,则可以使用 Tooling API 的取消机制取消构建。
限制
在某些情况下,持续构建可能无法检测到输入的更改。
创建输入目录
有时,由于文件系统监听的工作方式,创建先前缺失的输入目录不会触发构建。例如,创建 src/main/java
目录可能不会触发构建。同样,如果输入是过滤后的文件树且没有文件匹配过滤器,则创建匹配文件可能不会触发构建。
项目目录外部文件的更改
Gradle 只监听项目目录内部文件的更改。项目目录外部文件的更改将不被检测到,也不会触发构建。
构建循环
Gradle 在任务执行之前开始监听更改。如果任务在执行时修改了自己的输入,Gradle 将检测到更改并触发新的构建。如果每次任务执行时输入都被再次修改,构建将再次被触发。这并非持续构建独有的问题。修改自己输入的任务在“正常”运行而非持续构建时,永远不会被认为是最新状态。
如果您的构建进入这样的构建循环,您可以通过查看 Gradle 报告的已更改文件列表来追踪任务。在确定每次构建期间发生更改的文件后,您应该查找以该文件作为输入的任务。在某些情况下,这可能是显而易见的(例如,Java 文件由 compileJava
编译)。在其他情况下,您可以使用 --info
日志来查找由于识别出的文件而导致过期的任务。
符号链接的更改
通常,Gradle 不会检测符号链接或通过符号链接引用的文件的更改。
不考虑构建逻辑的更改
当前实现不会在后续构建中重新计算构建模型。这意味着任务配置的更改或构建模型的任何其他更改都会被有效地忽略。
在 IDE 中使用持续构建
大多数现代 IDE,如 IntelliJ IDEA、Android Studio 或 Eclipse,都已提供自己的连续编译和测试执行形式。
例如,如果您只关心在文件更改时触发某些操作(例如运行测试或生成文档),可以考虑使用 IntelliJ 的 文件监视器 功能作为特定任务的替代方案。
Gradle 的 --continuous
模式专为命令行使用而设计,通常不集成到 IDE 工作流程中。要在 IDE 环境中使用持续构建,请在终端窗口中与 IDE 并行运行 ./gradlew <task> --continuous
。