Appearance
配置缓存
配置缓存(Configuration Cache)是 Gradle 8+ 的重要特性,将配置阶段的结果缓存起来,下次跳过整个配置阶段,进一步加速构建。
启用配置缓存
bash
# 单次启用
./gradlew build --configuration-cache
# 第一次(需要配置):
# Calculating task graph as no cached configuration is available for tasks: build
# ...
# Configuration cache entry stored.
# 第二次(使用缓存):
# Reusing configuration cache.
# ...
# BUILD SUCCESSFUL in 0sproperties
# gradle.properties(永久启用)
org.gradle.configuration-cache=true配置缓存的要求
配置缓存对构建脚本有严格要求,需要避免在配置阶段:
kotlin
// ❌ 错误:在配置阶段访问文件系统(应在执行阶段)
tasks.register("badTask") {
val content = file("config.txt").readText() // 配置阶段读文件!
doLast { println(content) }
}
// ✅ 正确:使用 Provider 懒加载
tasks.register("goodTask") {
val content = providers.fileContents(layout.projectDirectory.file("config.txt")).asText
doLast { println(content.get()) }
}kotlin
// ❌ 错误:在配置阶段调用 exec
tasks.register("badTask") {
val gitHash = "git rev-parse HEAD".execute() // 配置阶段执行命令!
doLast { println(gitHash) }
}
// ✅ 正确:使用 providers.exec
tasks.register("goodTask") {
val gitHash = providers.exec {
commandLine("git", "rev-parse", "--short", "HEAD")
}.standardOutput.asText.map { it.trim() }
doLast { println(gitHash.get()) }
}常见不兼容问题
kotlin
// ❌ 直接引用 Project 对象(配置缓存不能序列化 Project)
tasks.register("badTask") {
val p = project // 持有 project 引用
doLast { println(p.name) }
}
// ✅ 提前获取需要的值
tasks.register("goodTask") {
val projectName = project.name // 提前提取值
doLast { println(projectName) }
}检查兼容性
bash
# 检查构建脚本是否兼容配置缓存
./gradlew build --configuration-cache
# 如有问题会生成报告
# build/reports/configuration-cache/*/configuration-cache-report.html配置缓存状态
| 状态 | 说明 |
|---|---|
Configuration cache entry stored. | 首次运行,缓存已保存 |
Reusing configuration cache. | 使用缓存,跳过配置阶段 |
Configuration cache entry reused. | 缓存命中 |
Calculating task graph as configuration has changed. | 配置变更,重新配置 |