2016-11-28 44 views
1

调用任务我知道,从另一个任务调用任务的当前支持的方法是使用dependsOnfinalizedBy,但我碰到这个问题。gradle这个:从另一个任务

我有个任务,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 

如果直接调用,或从不同的任务doFirstdependsOn什么的,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 
    } 
} 

这里的问题是,taskB被检查onlyIf之前taskA将执行,所以即使条件不满足,taskA将执行。

我该如何做到这一点?

回答

4

似乎可以不早于后任务的图形已经解决了配置。在早期阶段,所有条件将在配置阶段评估为时尚早。看看这个:

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 
} 

和输出:

 ~/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 
+0

'gradle'变量来自哪里? – ewok

+0

可能值得注意的是,这不会发生在我的'build.gradle'文件中。这是在一个单独的Groovy文件中,用于配置插件 – ewok

+0

@ewok,一个单独的配置插件的groovy文件?它是如何工作的? 'gradle'在'project'实例上被定义为从其他地方取出的所有其他变量;} ​​ – Opal

-1

我知道这是不建议被大多数人,但我做到了通过实际执行任务,正是如此:

task a { 
    doLast { 
     println 'a' 
    } 
} 

task b { 
    doLast { 
     a.execute() 
     println 'b' 
    } 

    outputs.upToDateWhen { 
    conditionA() && conditionB() 
    } 
} 
+0

不应该直接调用'execute'。 – Opal

+0

所以他们说。我并不真正关注编码原教旨主义。有“不应该”的规则表明你何时打破范式,但有时候打破范式是做事最简单的方法。 – xaviersjs

+0

_最简单的可能性并不意味着它应该被遵循。此外,这不是一个范式问题 - 但会损害gradle内部。 – Opal