如何在配置步骤中将 Gradle 属性 设置为不同的值?

How can you set a Gradle property to different values in the configuration step?

This Android example build file 包含代码段

    buildTypes {
        release {
            minifyEnabled true
        }

但是由于 Gradle 总是在构建脚本中执行所有配置语句,即使对于调试构建,这不会总是将 minifyEnabled 设置为 true 吗?

希望 Gradle 让我在一个任务中将变量设置为 true 而在另一个任务中设置为 false 并进行不同的配置,但这是我唯一的方法能够做到这一点是等待 taskGraph.whenReady。这是它通常的工作方式:

def myBool = false

task runs {
    myBool = true
}

task doesNotRun {
    myBool = false
}

task whoWins(dependsOn: runs) {
    doLast { println "myBool is ${myBool}" }
}

gradle whoWins
:runs
:whoWins
myBool is false

配置步骤是为了帮助Gradle构建任务执行图(实际上是运行),这就是执行所有配置代码的原因。您所描述的听起来像是循环任务依赖性,其中任务依赖于由任务设置的变量,而该任务又依赖于第一个任务。

Task A -> depends on Task B -> depends on variable from Task A

您可能正在寻找的是基于执行图配置任务的能力。请参阅 Gradle 用户指南第 6.13 节 Configure by DAG。使用它可以让您打破循环依赖。

Task A -> depends on Task B -> depends on gradle.taskGraph.whenReady

或者您可以创建一个新任务 Task C,它根据任务图处理设置变量。

def myBool = false

task runs {}

task doesNotRun {}

task whoWins(dependsOn: runs) {
    doLast { println "myBool is ${myBool}" }
}

task taskC << {
    if (gradle.taskGraph.hasTask(runs)) {
        myBool = true
    } else if (gradle.taskGraph.hasTask(doesNotRun)) {
        myBool = false
    }
}
runs.dependsOn(taskC)
doesNotRun.dependsOn(taskC)

结果:

$ gradle whois
:taskC
:runs
:whoWins
myBool is true