Skip to content

配置缓存

配置缓存(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 0s
properties
# 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.配置变更,重新配置

下一步