Skip to content

延迟属性 (Lazy API)

源:Lazy Configuration

在 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>。这不仅能提升构建速度,还能让任务之间的依赖逻辑自动、隐式地建立。