我有三个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 */
}
}
因此,任务SomeCopy
和someAction
都依赖于checkNeeded
。 checkNeeded
的作用是在发现不需要这两项任务时将其禁用。
但是,它崩溃,但以下异常:Cannot call Task.setEnabled(boolean) on task ':SomeCopy' after task has started execution
。
那么,如何保证某个任务可以在其他任务之前运行,而这些任务又可以在不需要时禁用其他任务呢?
答案 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 {...}
块中(它将仍然可以在配置阶段执行,但稍后)
另一种选择是在运行checkNeeded
或SomeCopy
之一之前显式执行SomeAction
任务