学习 Gradle 增量构建的基础知识。

在本节中,您将

  • 使用 Gradle 属性

  • 理解增量构建

  • 探索 task 结果标签

步骤 0. 开始之前

  1. 您在第 1 部分中初始化了您的 Java 应用程序。

  2. 您在第 2 部分中运行了多个 task。

  3. 您在第 3 部分中学习了依赖管理。

  4. 您在第 4 部分中将插件应用到您的应用程序。

步骤 1. 理解增量构建

重要的是要知道 Gradle 以多种方式优化您的构建。其中一种优化称为增量构建

增量构建是一种避免运行自上次构建以来输入未更改的 task 的构建,从而使此类 task 的执行变得不必要。

为了使增量构建能够工作,task 必须定义其输入和输出。在构建时,Gradle 将确定输入或输出是否已更改。如果它们已更改,Gradle 将执行 task。否则,它将跳过执行。

步骤 2. 更新 Gradle 属性

为了更好地看到增量构建的实际效果,我们将控制台输出切换到 verbose 模式。

在您的应用程序的顶层文件夹 (tutorial) 中,创建一个 gradle.properties 文件。

$ touch gradle.properties

添加 org.gradle.console=verbose,使文件内容如下所示

gradle.properties
org.gradle.console=verbose

步骤 3. 分析增量构建

使用 ./gradlew :app:clean :app:build 命令运行 clean task,然后运行 build task

$ ./gradlew :app:clean :app:build

> Task :app:clean
> Task :app:compileJava
> Task :app:processResources NO-SOURCE
> Task :app:classes
> Task :app:jar
> Task :app:startScripts
> Task :app:distTar
> Task :app:distZip
> Task :app:assemble
> Task :app:compileTestJava
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses
> Task :app:test
> Task :app:check
> Task :app:build

BUILD SUCCESSFUL in 1s
8 actionable tasks: 8 executed

不足为奇,Gradle 调用了构建应用程序所需的所有 task。这已成功完成。

再次运行 build,以查看实际的增量构建优化

$ ./gradlew :app:build

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE

BUILD SUCCESSFUL in 409ms
7 actionable tasks: 7 up-to-date

现在大多数 task 都带有 UP-TO-DATE 标签。这就是 Gradle 告知我们输入和输出未更改,因此某些 task 未重新运行的方式。

步骤 4. 理解结果标签

当 verbose 模式开启时,开发人员可以使用四个标签来查看 task 结果

结果标签 描述

UP-TO-DATE

已执行且未更改的 Task(增量构建功能)

SKIPPED

Task 被显式阻止运行

FROM-CACHE

Task 输出已从构建缓存中先前构建复制到本地目录(缓存功能)

NO-SOURCE

Task 未执行,因为其所需的输入不可用

如果没有标签,则表示 task 由 Gradle(本地)新执行。

我们将在下一节中查看 FROM-CACHE 标签。

下一步: 启用构建缓存 >>