Gradle:使用一个任务禁用另一个任务

时间:2019-02-04 16:35:25

标签: gradle kotlin gradle-plugin

我有三个gradle任务(这是插件中的kotlin代码):

project.task<Task>("checkNeeded") {
    doLast {
        if (someTest()) {
            listOf("SomeCopy", "SomeAction")
                    .map { project.tasks[it] as AbstractTask }
                    .forEach { it.isEnabled = false }
        }
    }
}

project.task<Copy>("SomeCopy") {
    dependsOn("checkNeeded")
    from(wherever)
    into(whatever)
}

project.task<Task>("SomeAction") {
    dependsOn("checkNeeded")
    doLast {
        /* something magical */
    }
}

因此,任务SomeCopysomeAction都依赖于checkNeededcheckNeeded的作用是在发现不需要这两项任务时将其禁用。

但是,它崩溃,但以下异常:Cannot call Task.setEnabled(boolean) on task ':SomeCopy' after task has started execution

那么,如何保证某个任务可以在其他任务之前运行,而这些任务又可以在不需要时禁用其他任务呢?

2 个答案:

答案 0 :(得分:1)

我最终用onlyIf解决了这个问题:

var needed by Delegates.notNull<Boolean>()

project.task<Task>("checkNeeded") {
    doLast {
        needed = !someTest()
    }
}

project.task<Copy>("SomeCopy") {
    dependsOn("checkNeeded")
    onlyIf { needed }
    from(wherever)
    into(whatever)
}

project.task<Task>("SomeAction") {
    dependsOn("checkNeeded")
    onlyIf { needed }
    doLast {
        /* something magical */
    }
}

请注意,checkNeeded任务并不是必需的,但是我希望在此过程中知道何时进行检查。我可以做到的:

val needed by lazy { !someTest() }

project.task<Copy>("SomeCopy") {
    onlyIf { needed }
    from(wherever)
    into(whatever)
}

project.task<Task>("SomeAction") {
    onlyIf { needed }
    doLast {
        /* something magical */
    }
}

答案 1 :(得分:0)

dependsOn确实设置了顺序。将if移出checkNeeded任务可能是有意义的,然后将其放置在构建脚本(它将在配置阶段中执行)或afterEvaluate {...}块中(它将仍然可以在配置阶段执行,但稍后)

另一种选择是在运行checkNeededSomeCopy之一之前显式执行SomeAction任务