有条件地调用Gradle任务

fv2wmkja  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(217)

假设我有两个任务:

tasks.register('taskA') {
  // do something
}

tasks.register('taskB') {
  // do something else
}

对于我的gradle构建,我只想调用任务“build”,它应该根据条件决定调用其他哪个任务:

tasks.register('build') {
    doLast {
        if (condition == true) {
            // tasks.named('taskA').execute {}
        } else {
            // tasks.named('taskB').execute {}
        }
    }
}

没有“执行”这样的函数,但在Gradle中归档这种行为的最佳实践是什么?我还读到,如果可能,应该避免“依赖”。

lrpiutwd

lrpiutwd1#

您的示例显示正在创建build任务。通常,在您应用所提供的Gradle插件(如Java Plugin)时,此任务已创建。通常在应用Gradle提供的插件时应用Base Plugin。在某些使用情形中,您可以手动应用插件。此答案假定已应用Java插件,使用Kotlin DSL,和8年级。
您可以使用任务 predicate 来有条件地执行任务。建议避免使用dependsOn,因为在Gradle中通常有一种惯用的方式来表达您的意图。在这种情况下,任务 predicate 正是您所需要的。例如:

tasks {
    val taskA by registering {
        onlyIf("condition A is satisfied") {
            1 + 1 == 2
        }
        doLast {
            // task execution logic
        }
    }
    val taskB by registering {
        onlyIf("condition A is satisfied") {
            1 + 1 == 2
        }
        doLast {
            // ...
        }
    }
    build {
        dependsOn(taskA, taskB)
    }
}

分解如下:
1.按照您所做的那样注册任务,但是要使用onlyIf predicate 。任务只有在满足 predicate 的情况下才会执行。
1.将doLast { }用于任务执行逻辑。对于更复杂的用途,请考虑创建custom task type
1.内置的build任务在Gradle中不包含任何有意义的语义,它是一个"捕获所有"构建所有内容的任务。因此,在这种情况下使用dependsOn是合适的。

相关问题