到這里,我們已經會定義一個task了,這一節我們討論下task與task之前的關系
例如:在 java build過程中,我們不可能打jar包放在編譯源碼之前
我們將討論配置task關系的如下三種方面:
1."dependsOn" 2."finalizedBy" 3."mustRunAfter"
1."dependsOn":
Task A 'dependsOn' task B,意思是如果task B 沒有完成的話, task A不成執行它的任務.
例如:你必須先穿上襪子后,才能穿鞋
task putOnSocks {
????doLast {
????????println "Putting on Socks."
????}
}
task putOnShoes {
????dependsOn "putOnSocks"
????doLast {
????????println "Putting on Shoes."
????}
}
Note:需要注意一點是當你執行"gradle tasks"時,你是看不到'putOnSocks' 的,這是因為gradle 認為'putOnSocks'的存在是為'putOnShoes'做準備的.如果仍然要看到,可以執行"gradle tasks --all"命令
2."finalizedBy":
Task A is `finalizedBy` task B是如果每次執行Task A,Task B 都會在其之后執行.
例如:每次吃完早餐后,要刷牙
task eatBreakfast {
????finalizedBy "brushYourTeeth"
????doLast{
????????println "Om nom nom breakfast!"
? ? }
}
task brushYourTeeth {
????doLast {
????????println "Brushie Brushie Brushie."
????}
}
3."mustRunAfter":
這個關系看起來不是那么明顯的見明知意,當我運行一個可能失敗的流程,像部署一個代碼到持續集成的服務端時,同時我們也會運行一個像單元測試一樣的小的很可能失敗任務,這兩個任務沒有關系,但我們想單元測試任務運行在集成測試之前,且兩個都執行,這個時候就可以用"mustRunAfter".
例如:洗澡和噴香水,洗澡不要求噴香水,噴香水前也不要求先洗澡,但當我們將兩者放在一起時,我們都希望洗完澡后,噴香水
task takeShower {
????doLast {
????????println "Taking a shower."
????}????
}
task putOnFragrance {
????shouldRunAfter "takeShower"
????doLast{
????????println "Smellin' fresh!"????
????}
}
接下來,當我們執行"gradle?putOnFragrance takeShower"時,我們確實看到他們是按一定順序執行的
當然,一個任務可以同時依賴多個任務
task getReady {
????// Remember that when assigning a collection to a property, we need the
????// equals sign
????dependsOn = ["takeShower", "eatBreakfast", "putOnShoes"]
}
當然,我們洗完澡后才去穿上鞋,可以用 "mustRunAfter"
????putOnShoes.mustRunAfter takeShower
// 除此之個,一個更高級的語法,可以去選你想依賴的task 如下例
task getEquipped {
????dependsOn tasks.matching{ task -> task.name.startsWith("putOn")}
? ? doLast {
????????println "All geared up!"
????}
}