延迟属性 (Lazy API)
在 Gradle 早期,我们直接使用普通的变量(如 String)。这导致了一个严重的问题:你必须在配置阶段就确定这些变量的值。如果值来自另一个 Task 的输出,就会发生冲突。
Lazy API (Property<T>, Provider<T>) 完美解决了这一痛点。
1. 核心思想
- Property: 一个可以被修改、可以被观察的数据容器。
- Provider: 一个只读的数据源,它的值可以在执行阶段才计算出来。
延迟计算
你可以把 Property 想象成一个 Lambda。只要你不调用 .get(),它就不会去计算真实的值。
2. 避免配置期爆炸
错误做法
kotlin
// 在配置阶段直接 get,会强行执行关联的逻辑,拖慢速度
val value = myProperty.get()kotlin
abstract class MyTask : DefaultTask() {
// 自动由 Gradle 实例化
@get:Input
abstract val message: Property<String>
@TaskAction
fun run() {
// 只有在执行阶段才真正读取值
println(message.get())
}
}kotlin
val taskA = tasks.register("taskA") { ... }
tasks.register<MyTask>("taskB") {
// 自动建立依赖关系:taskB 不需要显示 dependsOn taskA
// 因为 taskB 使用了 taskA 的输出 Provider
message.set(taskA.flatMap { it.outputMessage })
}3. 转换 (map & flatMap)
你可以对 Provider 进行链式转换,而不需要立即求值。
kotlin
val upperMessage: Provider<String> = message.map { it.uppercase() }4. 总结
编写现代 Gradle 插件时,请务必使用 Property<T> 和 Provider<T>。这不仅能提升构建速度,还能让任务之间的依赖逻辑自动、隐式地建立。