Gradle Cheat Sheet (4): Task Dependencies
Contents [show]
1. dependsOn
任务A dependsOn 任务B,表示任务A只能在任务B完成之后进行。例如:
task putOnSocks {
doLast {
println "Putting on Socks."
}
}
task putOnShoes {
dependsOn "putOnSocks"
doLast {
println "Putting on Shoes."
}
}
task putOnSocks {
doLast {
println "Putting on Socks."
}
}
task putOnShoes {
dependsOn "putOnSocks"
doLast {
println "Putting on Shoes."
}
}
task putOnSocks { doLast { println "Putting on Socks." } } task putOnShoes { dependsOn "putOnSocks" doLast { println "Putting on Shoes." } }
执行:
$ gradle putOnShoes
$ gradle putOnShoes
$ gradle putOnShoes
输出为:
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:putOnSocks Putting on Socks. :putOnShoes Putting on Shoes.
此时使用gradle tasks 会发现看不到putOnSocks这个任务,因为Gradle认为putOnSocks只是为了帮助putOnShoes而存在的。可以通过:
$ gradle tasks --all
$ gradle tasks --all
$ gradle tasks --all
查看所有任务,就可以看到putOnSocks了。
2. finalizedBy
任务A finalizedBy 任务B,表示每次任务A执行完成后,都要再接着执行任务B。例如:
task eatBreakfast {
finalizedBy "brushYourTeeth"
doLast{
println "Om nom nom breakfast!"
}
}
task brushYourTeeth {
doLast {
println "Brushie Brushie Brushie."
}
}
task eatBreakfast {
finalizedBy "brushYourTeeth"
doLast{
println "Om nom nom breakfast!"
}
}
task brushYourTeeth {
doLast {
println "Brushie Brushie Brushie."
}
}
task eatBreakfast { finalizedBy "brushYourTeeth" doLast{ println "Om nom nom breakfast!" } } task brushYourTeeth { doLast { println "Brushie Brushie Brushie." } }
执行:
$ gradle eatBreakfast
$ gradle eatBreakfast
$ gradle eatBreakfast
输出为:
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:eatBreakfast Om nom nom breakfast! :brushYourTeeth Brushie Brushie Brushie.
3. mustRunAfter
任务A mustRunAfter 任务B,表示如果要同时执行任务A和任务B,则先执行任务B,任务B完成后再执行任务A。任务A和任务B之间没有其他依赖,都可以单独执行。例如:
task takeShower {
doLast {
println "Taking a shower."
}
}
task putOnFragrance {
shouldRunAfter "takeShower"
doLast{
println "Smellin' fresh!"
}
}
task takeShower {
doLast {
println "Taking a shower."
}
}
task putOnFragrance {
shouldRunAfter "takeShower"
doLast{
println "Smellin' fresh!"
}
}
task takeShower { doLast { println "Taking a shower." } } task putOnFragrance { shouldRunAfter "takeShower" doLast{ println "Smellin' fresh!" } }
执行:
$ gradle putOnFragrance takeShower
$ gradle putOnFragrance takeShower
$ gradle putOnFragrance takeShower
输出为:
:takeShower
Taking a shower.
:putOnFragrance
Smellin' fresh!
:takeShower
Taking a shower.
:putOnFragrance
Smellin' fresh!
:takeShower Taking a shower. :putOnFragrance Smellin' fresh!
4. 多依赖
一个任务可以依赖于多个任务:
task getReady {
// Remember that when assigning a collection to a property, we need the
// equals sign
dependsOn = ["takeShower", "eatBreakfast", "putOnShoes"]
}
task getReady {
// Remember that when assigning a collection to a property, we need the
// equals sign
dependsOn = ["takeShower", "eatBreakfast", "putOnShoes"]
}
task getReady { // Remember that when assigning a collection to a property, we need the // equals sign dependsOn = ["takeShower", "eatBreakfast", "putOnShoes"] }
注意这里把集合赋给dependsOn,不能省略等号。执行:
$ gradle getReady
$ gradle getReady
$ gradle getReady
输出为:
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:takeShower
Taking a shower.
:getReady
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:takeShower
Taking a shower.
:getReady
:eatBreakfast Om nom nom breakfast! :brushYourTeeth Brushie Brushie Brushie. :putOnSocks Putting on Socks. :putOnShoes Putting on Shoes. :takeShower Taking a shower. :getReady
从上面的输出可以发现一个问题,takeShower被放在了putOnSocks和putOnShoes之后,因为takeShower和putOnSocks、putOnShoes之间都没有依赖,需要再加上一条依赖:
putOnShoes.mustRunAfter takeShower
putOnShoes.mustRunAfter takeShower
putOnShoes.mustRunAfter takeShower
此时再执行:
$ gradle getReady
$ gradle getReady
$ gradle getReady
输出为:
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:takeShower
Taking a shower.
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:getReady
:eatBreakfast
Om nom nom breakfast!
:brushYourTeeth
Brushie Brushie Brushie.
:takeShower
Taking a shower.
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:getReady
:eatBreakfast Om nom nom breakfast! :brushYourTeeth Brushie Brushie Brushie. :takeShower Taking a shower. :putOnSocks Putting on Socks. :putOnShoes Putting on Shoes. :getReady
可见takeShower放在了putOnSocks之前(putOnShoes依赖于putOnSocks)。
5. 匹配任务
可以使用tasks.matching在当前的任务中进行匹配,查找特定的任务。如为getEquipped添加dependsOn依赖,为所有以“putOn”开头的任务:
task getEquipped {
dependsOn tasks.matching{ task -> task.name.startsWith("putOn")}
doLast {
println "All geared up!"
}
}
task getEquipped {
dependsOn tasks.matching{ task -> task.name.startsWith("putOn")}
doLast {
println "All geared up!"
}
}
task getEquipped { dependsOn tasks.matching{ task -> task.name.startsWith("putOn")} doLast { println "All geared up!" } }
执行:
$ gradle getEquipped
$ gradle getEquipped
$ gradle getEquipped
输出为:
:putOnFragrance
Smellin' fresh!
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:getEquipped
All geared up!
:putOnFragrance
Smellin' fresh!
:putOnSocks
Putting on Socks.
:putOnShoes
Putting on Shoes.
:getEquipped
All geared up!
:putOnFragrance Smellin' fresh! :putOnSocks Putting on Socks. :putOnShoes Putting on Shoes. :getEquipped All geared up!
本部分的完整代码可以在这里找到。