2016-11-28 81 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