我知道当前支持的从另一个任务调用任务的方法是使用dependsOn或finalizedBy,但我遇到了这个问题.
我有一个任务,taskA可以自己使用.我有另一个任务,taskB当被召唤时,将依赖于它taskA.问题是,taskB如果失败,则需要跳过任务的其他条件.这是我要去的工作流程:
$ gradle taskA
:taskA
BUILD SUCCESSFUL
$ gradle taskB
checking condition 1... PASS
checking condition 2... PASS
:taskA
:taskB
BUILD SUCCESSFUL
$ gradle taskB
checking condition 1... PASS
checking condition 2... FAIL
:taskA SKIPPED
:taskB SKIPPED
BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)
如果直接调用,或者作为一个doFirst或dependsOn来自不同任务的某个东西,则taskA应该执行而不管条件如何.但是如果taskB被调用,条件必须在taskA执行之前通过.这是我尝试过的:
project.tasks.create(name: "taskB", type: MyTask, dependsOn: "taskA")
project.taskB{
onlyIf {
if (!conditionA()){
return false
}
if (!conditionB()){
return false
}
return true
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是taskA在onlyIf检查之前执行taskB,所以即使条件失败,taskA也会执行.
我怎么能做到这一点?
它似乎可以在任务图表解析后立即配置.在早期阶段,所有条件都将在配置阶段进行评估,这太早了.看看这个:
task a {
doLast {
println 'a'
}
}
task b {
dependsOn a
doLast {
println 'b'
}
}
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(b)) {
a.enabled = b.enabled = check1() && check2()
}
}
boolean check1() {
def ok = project.hasProperty('c')
println "check 1: ${ok ? 'PASS' : 'FAIL'}"
ok
}
boolean check2() {
def ok = project.hasProperty('d')
println "check 2: ${ok ? 'PASS' : 'FAIL'}"
ok
}
Run Code Online (Sandbox Code Playgroud)
并输出:
? ~/tutorial/stackoverflow/40850083/ [master] gradle a
:a
a
BUILD SUCCESSFUL
Total time: 1.728 secs
? ~/tutorial/stackoverflow/40850083/ [master] gradle b
check 1: FAIL
:a SKIPPED
:b SKIPPED
BUILD SUCCESSFUL
Total time: 1.739 secs
? ~/tutorial/stackoverflow/40850083/ [master] gradle b -Pc
check 1: PASS
check 2: FAIL
:a SKIPPED
:b SKIPPED
BUILD SUCCESSFUL
Total time: 1.714 secs
? ~/tutorial/stackoverflow/40850083/ [master] gradle b -Pc -Pd
check 1: PASS
check 2: PASS
:a
a
:b
b
BUILD SUCCESSFUL
Total time: 1.745 secs
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6399 次 |
| 最近记录: |