学习 Gradle 缓存系统的基础知识。
步骤 1. 理解缓存
增量构建是一个很好的优化,有助于避免已经完成的工作。如果开发人员不断更改单个文件,则可能无需重建项目中的所有其他文件。
但是,当同一开发人员决定切换到上周创建的新分支时会发生什么?文件会被重建,即使开发人员正在构建以前构建过的东西。
这就是构建缓存的用武之地。缓存存储以前的构建结果,并大大减少了在本地已构建过的内容时重新构建的需求。
让我们首先为您的应用程序启用本地构建缓存。
步骤 2. 启用本地构建缓存
使用 ./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
将 org.gradle.caching=true
添加到 gradle.properties
文件
org.gradle.console=verbose
org.gradle.caching=true
步骤 3. 使用本地构建缓存
运行 build task 以填充本地构建缓存
$ ./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 在控制台输出中告知我们每个 task 的结果
-
FROM-CACHE
- task 已从本地构建缓存中获取。 -
UP-TO-DATE
- 使用增量构建且未重新运行的 task。
总结一下
-
首先,我们使用
build
task 将 task 输入和输出填充到本地缓存中——我们可以想象这是在一周前完成的。 -
然后,我们使用
clean
task 来模拟切换分支——覆盖以前的输出。 -
最后,我们使用了
build
task——与增量构建不同,以前的输出存储在本地缓存中,可以重复使用。
Gradle 非常高效,尤其是在启用本地构建缓存的情况下。Gradle 将查看您机器上的缓存目录,以检查可能已存在的输出文件。如果存在,它将复制其(输出)结果到您的项目 build
目录中,而不是运行该 task。
结果标签 FROM-CACHE
让用户知道 Gradle 已从本地构建缓存中获取了 task 结果。
本地 Gradle 构建缓存位于
-
在 Windows 上:%USERPROFILE%\.gradle\caches
-
在 OS X / UNIX 上:~/.gradle/caches/
Gradle 将定期清理本地构建缓存目录,删除最近未使用的条目以节省磁盘空间。
步骤 4. 理解远程缓存
除了开发人员机器上存在的本地构建缓存之外,Gradle 还可以使用远程构建缓存,远程构建缓存可以被多个开发人员使用。
远程缓存的想法是在远程构建之间共享常用构建的 task 输出,以缩短构建时间。
当同时启用远程缓存和本地缓存时,构建输出将首先在本地缓存中检查。如果输出在本地缓存中不存在,则将从远程缓存下载,并存储在本地缓存中。
为了试用远程构建缓存,Gradle 为单个远程构建缓存节点提供了一个免费的 Docker 镜像。对于生产级部署,建议使用 Develocity。
下一步: 使用参考资料 >>