2016-11-15 70 views
4

我正在使用Gradle。我有兩個任務:「a」和「b」。我想要任務「a」來調用任務「b」。我怎樣才能做到這一點?從gradle中的任務調用另一個任務

task b(type: Exec) { 
    description "Task B" 
    commandLine 'echo', 'task-b' 
} 

task a(type: Exec) { 
    description "Task A" 
    commandLine 'echo', 'task-a' 
    // TODO: run task b 
} 

在螞蟻這是一塊蛋糕:

<target name="a"> 
    <echo message="task-a"/> 
    <antcall target="b"/> 
</target> 
<target name="b"> 
    <echo message="task-b"/> 
</target> 

我試圖使用「dependsOn」特徵的第一種方法。然而,這並不理想,因爲我們需要反思所有任務,並且還有其他一些問題(例如滿足條件時運行任務)。

我嘗試另一種方法是:如果

b.mustRunAfter(a) 

但是這隻能我運行gradle這個任務,像這樣:

gradle -q a b 

這也是不理想的。

無論如何只是從現有任務調用另一個任務嗎?

+1

怎麼樣終結任務是什麼? https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:finalizer_tasks – AdamSkywalker

回答

6

作爲建議的一種方法是添加一個終結的任務

task beta << { 
    println 'Hello from beta' 
} 

task alpha << { 
    println "Hello from alpha" 
} 

// some condition 
if (project.hasProperty("doBeta")) { 
    alpha.finalizedBy beta 
} 

然後如果需要,我們可以執行其他任務。至於從其他任務執行任務,你不能這樣做。任務聲明是聲明式的,不是必須的。所以任務可以依賴於另一個任務,但是他們不能執行另一個任務。

$ gradle -q alpha 
Hello from alpha 
$ gradle -q alpha -PdoBeta 
Hello from alpha 
Hello from beta 
4

您可以使用

a.dependsOn 'b' 

或者

a.dependsOn b 

或者

task a(type: Exec, dependsOn: 'b') { ... } 

參見adding dependencies to tasks

2

總結和@JBirdVegas和@槍的Java結合的答案,使用非棄用doLast代替leftShift(<<):

task beta { 
    doLast { 
     println 'Hello from beta' 
    } 
} 

task alpha { 
    doLast { 
     println 'Hello from alpha' 
    } 
} 

// some condition 
if (project.hasProperty('doBeta')) { 
    alpha.finalizedBy beta // run 'beta' after 'alpha' 
    // or 
    // alpha.dependsOn beta // run 'beta' before 'alpha' 
}