Gradle: используйте задачу, чтобы отключить другую задачу - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть три задачи (это код 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 */
    }
}

Итак, обе задачи SomeCopy и someAction зависят от checkNeeded.Роль checkNeeded состоит в том, чтобы отключить эти две задачи, если они обнаружат, что они не нужны.

Однако происходит сбой со следующим исключением: Cannot call Task.setEnabled(boolean) on task ':SomeCopy' after task has started execution.

Итак, как можноУ меня есть задача, которая гарантированно запускается раньше других задач, которые могут отключить другие задачи, если они не нужны?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я решил эту проблему с помощью 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 */
    }
}
0 голосов
/ 04 февраля 2019

dependsOn устанавливает порядок.Возможно, имеет смысл переместить if за пределы задачи checkNeeded и поместить его либо в сценарий сборки (он будет выполнен на этапе конфигурации), либо в блок afterEvaluate {...} (он все еще будет выполняться в конфигурациифаза, но позже)

Другой вариант - явно выполнить задачу checkNeeded перед запуском одного из SomeCopy или SomeAction

...