学习 Gradle 缓存系统的基础知识。

在本节中,你将

  • 打开本地构建缓存

  • 了解缓存

  • 探索远程构建缓存

第 0 步:开始之前

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

  2. 您在第 2 部分中运行了几个任务。

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

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

  5. 您在第 5 部分中了解了增量构建。

第 1 步:了解缓存

增量构建是一种很好的优化,有助于避免重复工作。如果开发人员在一个文件中不断进行更改,则可能无需重新构建项目中的所有其他文件。

然而,当同一个开发人员决定切换到上周创建的新分支时,会发生什么?文件被重新构建,即使开发人员正在构建以前已经构建过的东西。

这时构建缓存就很有用了。缓存存储以前的构建结果,大大减少了在本地已经构建过的情况下重新构建的需要。

让我们首先为您的应用程序打开本地构建缓存。

第 2 步:启用本地构建缓存

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

$ ./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

org.gradle.caching=true 添加到 gradle.properties 文件中

gradle.properties
org.gradle.console=verbose
org.gradle.caching=true

第 3 步:使用本地构建缓存

运行构建任务以填充本地构建缓存

$ ./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

毫不奇怪,由于增量构建,Gradle 注意到没有任何更改。然而,在后台,本地构建缓存已经被填充。

让我们再次运行 clean 和 build

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

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

BUILD SUCCESSFUL in 525ms
8 actionable tasks: 5 executed, 3 from cache

Gradle 在控制台输出中告诉我们每个任务的结果

  • FROM-CACHE - 任务已从本地构建缓存中获取。

  • UP-TO-DATE - 使用增量构建且未重新运行的任务。

总结一下

  1. 首先,我们使用 build 任务用任务输入和输出填充我们的本地缓存 — 我们可以想象这已经在一周前完成。

  2. 然后,我们使用 clean 任务来模拟切换分支 — 覆盖以前的输出。

  3. 最后,我们使用 build 任务 — 与增量构建不同,以前的输出存储在本地缓存中并且可以重用。

Gradle 效率很高,尤其是在打开本地构建缓存的情况下。Gradle 将查看您机器上的缓存目录,检查可能已经存在的输出文件。如果它们存在,它将不会运行该任务,而是将其(输出)结果复制到您的项目 build 目录中。

结果标签 FROM-CACHE 告诉用户 Gradle 已从本地构建缓存中获取任务结果。

本地 Gradle 构建缓存位于

  • 在 Windows 上:%USERPROFILE%\.gradle\caches

  • 在 OS X / UNIX 上:~/.gradle/caches/

Gradle 将定期清理本地构建缓存目录,通过删除最近未使用的条目来节省磁盘空间。

第 4 步:了解远程缓存

除了开发人员机器上存在的本地构建缓存之外,Gradle 还可以使用可供多个开发人员使用的远程构建缓存。

远程缓存的目的是在远程构建之间共享常用构建的任务输出,以缩短构建时间。

当同时启用远程和本地缓存时,首先会在本地缓存中检查构建输出。如果本地缓存中不存在输出,它将从远程缓存下载并也存储在本地缓存中。

为了试用远程构建缓存,Gradle 为单个远程构建缓存节点提供了一个免费的 Docker 镜像。对于生产级部署,推荐使用 Develocity

下一步: 使用参考资料 >>