Gradle 缓存
1. 概述
构建缓存可以使代码构建过程更快,从而提高开发人员的工作效率。在本文中,我们将了解 Gradle 构建缓存的基础知识。
2. 什么是 Gradle 构建缓存?
Gradle 构建缓存是保存构建任务输出的半永久性存储。它可以重用以前构建中已经生成的工件。**Gradle 构建缓存背后的指导原则是,它应该避免重建已经构建的任务,前提是输入没有改变。**这样,完成后续构建的时间就减少了。
**在 Gradle 中,构建缓存键唯一地标识工件或任务输出。**在执行任务之前,Gradle 通过散列任务的每个输入来计算缓存键。然后它查看远程或本地缓存以检查与计算出的缓存键对应的任务输出是否已经存在。如果它不存在,则执行任务。否则,Gradle 会重用现有的任务输出。
现在,让我们看看两种不同的 Gradle 构建缓存。
2.1. 本地构建缓存
本地构建缓存使用系统目录来存储任务输出。*默认位置是指向$USER_HOME/.gradle/caches*的 Gradle 用户主目录。**每次我们在系统中运行构建时,工件都会存储在这里。默认情况下启用它,并且它的位置是可配置的。
2.2. 远程构建缓存
远程缓存是一个共享的构建缓存。读取和写入远程缓存是通过 HTTP 完成的。远程缓存最常见的用例之一是持续集成构建。在每个干净的构建中,CI 服务器都会填充远程缓存。因此,被更改的组件不会被重新构建,从而加快了 CI 的构建。此外,任务输出也可以在 CI 代理之间共享。默认情况下不启用远程缓存。
当远程和本地缓存都启用时,首先在本地缓存中检查构建输出。如果本地缓存中不存在输出,则将从远程缓存中下载并存储在本地缓存中。然后,在下一次构建中,从本地缓存中获取相同的任务输出以加快构建过程。
3. 配置 Gradle 构建缓存
我们可以通过在settings.gradle文件中提供Settings.build-cache块来配置缓存。在这里,我们使用Groovy 闭包 来编写配置。下面我们来看看如何配置不同类型的缓存。
3.1. 配置本地构建缓存
让我们在settings.gradle文件中添加本地构建缓存配置:
buildCache {
local {
directory = new File(rootDir, 'build-cache')
removeUnusedEntriesAfterDays = 30
}
}
在上面的代码块中,directory对象表示存储构建输出的位置。这里,rootDir变量代表项目的根目录。我们还可以将directory对象更改为指向另一个位置。
**为了节省空间,本地构建缓存还会定期删除在指定时间段内未使用的条目。**属性removeUnusedEntriesAfterDays用于配置从本地缓存中删除未使用工件的天数。其默认值为 7 天。
*我们也可以通过从$USER_HOME/.gradle/caches文件夹中删除条目来手动清理它。**在 Linux 系统上,我们可以使用rm*命令来清理目录:
rm -r $HOME/.gradle/caches
我们还可以配置一些额外的属性。例如,enabled是一个布尔属性,表示是否启用本地缓存。如果push属性设置为true,构建输出将存储在缓存中 。默认情况下,对于本地构建缓存,其值为true 。
3.2. 配置远程缓存
让我们在settings.gradle 文件中添加buildCache块来配置远程缓存。
对于远程缓存,我们需要以 URL 的形式提供位置以及访问它的username和password:
buildCache {
remote(HttpBuildCache) {
url = 'https://example.com:8123/cache/'
credentials {
username = 'build-cache-user-name'
password = 'build-cache-password'
}
}
}
4. 使用Gradle 构建缓存的优势
现在让我们看看使用 Gradle 构建缓存的一些好处:
- 它可以通过减少构建时间来提高开发人员的生产力。
- 因为如果输入没有改变,任务输出会被重用,它还可以帮助减少在版本控制分支之间来回切换时的构建时间。
- 使用远程缓存可以显着减少 CI 代理生成构建所需的工作量。这也减少了 CI 构建所需的基础设施。
- 减少 CI 机器上的网络使用,因为远程缓存的结果将存储在本地缓存中。
- 远程缓存有助于在开发人员之间共享结果。这消除了在本地重新构建同一项目的其他开发人员所做的更改的需要。
- 远程缓存还可以启用 CI 代理之间的构建共享。
- 随着构建时间的减少,这会导致更快的反馈周期。因此,构建将更频繁地生成。因此,这可以提高软件的质量。