所謂任務(wù)就是Task伤极,這篇主要是了解Task的一些知識(shí)蛹找。
[多種方式創(chuàng)建任務(wù)]
方式一:
def Task test = task('taskA')
test.doLast {
println 'taskA'
}
taskA是Task名稱,test是一個(gè)對(duì)象哨坪,執(zhí)行taskA的命令如下:
gradlew taskA
輸出結(jié)果如下:
方式二:
創(chuàng)建方式和方式一差不多庸疾, 唯一的區(qū)別就是多了幾個(gè)參數(shù)。
- 將taskB分到mytask組中齿税,代碼如下:
def Task testB = task('taskB', group: 'mytask')
testB.doLast {
println 'taskB'
}
如圖所示:
- 將taskC分到mytask組下彼硫,并且添加描述,代碼如下:
def Task testC = task('taskC', group: 'mytask', description: '我是taskC的描述!E±骸词渤!')
testC.doLast {
println 'taskC'
}
如圖所示:
- 將taskD分到mytask組下,添加描述串绩,并依賴于taskC缺虐,代碼如下:
def Task testD = task('taskD', group: 'mytask', description: '我是taskC的描述!=阜病高氮!', dependsOn: taskC)
testD.doLast {
println 'taskD'
}
依賴關(guān)系前面幾篇文章已經(jīng)介紹過(guò)了,就是執(zhí)行taskD時(shí)總會(huì)先執(zhí)行taskC顷牌,taskC執(zhí)行完之后才會(huì)執(zhí)行taskD剪芍。
方式三:
task taskE {
description '我是taskE的描述!?呃丁罪裹!'
group 'mytask'
doLast {
println 'taskE'
}
}
如圖所示:
方式四:
tasks.create('taskF') {
description '我是taskF的描述!T舜臁状共!'
group 'mytask'
doLast {
println 'taskF'
}
}
如圖所示:
[多種方式訪問(wèn)任務(wù)]
方式一:
task taskA {
group 'mytask'
}
taskA.doLast {
println 'taskA'
}
這種方式只能訪問(wèn)當(dāng)前Project中的task。
方式二:
task taskB {
group 'mytask'
}
tasks['taskB'].doLast {
println 'taskB'
}
類似數(shù)組的訪問(wèn)形式谁帕,角標(biāo)是Task的名稱峡继,如果Task不存在,則發(fā)生異常匈挖。
這種訪問(wèn)方式也只能訪問(wèn)當(dāng)前Project中的task碾牌,不能訪問(wèn)其它Project中的task。
方式三:
子Project獲取主Project的task
rootProject.getTasks()['taskA']
方式四:
tasks.getByPath(':app1:taskAA').doLast {
println '11111111111111'
}
tasks.findByPath(':app1:taskAA').doLast {
println '22222222222222'
}
通過(guò)路徑訪問(wèn)子Project的task或同級(jí)Project的task儡循。
方式五:
tasks.findByName('taskA').doLast {
println '11111111111111'
}
tasks.getByName('taskA').doLast {
println '11111111111111'
}
通過(guò)task名稱訪問(wèn)同級(jí)task小染。
[<<操作符]
<<操作符在Gradle的Task上是doLast方法的短標(biāo)記形式,也就是說(shuō)“<<”可以代替doLast贮折。
task(taskA) << {
println '11111111111111'
}
task(taskA).doLast {
println '11111111111111'
}
以上兩段代碼效果其實(shí)是一樣的,但是资盅,在高版本Gradle中调榄,棄用了<<操作符。
[任務(wù)執(zhí)行順序]
task taskB {
doLast {
println 'test1'
}
doFirst {
println 'test2'
}
}
首先來(lái)看一下以上代碼呵扛,doFirst
和doLast
可以控制任務(wù)(task)中代碼的執(zhí)行順序每庆,doFirst
總是最先被執(zhí)行,doLast
總是最后被執(zhí)行今穿,所以打印結(jié)果是:
> Task :taskB
test2
test1
其實(shí)缤灵,任務(wù)(task)和任務(wù)(task)之間也是有執(zhí)行的先后順序的。
假設(shè)有兩個(gè)任務(wù):taskA和taskB
執(zhí)行以下命令(Window系統(tǒng)使用gradlew,Linux系統(tǒng)使用./gradlew)
gradlew taskB taskA
看到上面的命令腮出,一般理解為:先執(zhí)行taskB帖鸦,再執(zhí)行taskA,但是胚嘲,在Android工程中也許定義了N多個(gè)task作儿,到底先執(zhí)行哪個(gè)task并不清楚,那么問(wèn)題來(lái)了馋劈,怎么才能保證總是先執(zhí)行taskA攻锰,在執(zhí)行taskB?
shouldRunAfter
和mustRunAfter
可以做到妓雾,具體使用方法如下:
taskB.shouldRunAfter(taskA)
taskB.mustRunAfter(taskA)
shouldRunAfter:taskB應(yīng)該在taskA執(zhí)行之后執(zhí)行娶吞,這里應(yīng)該而不是必須,所以有可能任務(wù)順序并不會(huì)按預(yù)設(shè)的順序執(zhí)行械姻。
mustRunAfter:taskB必須在taskA執(zhí)行之后執(zhí)行妒蛇,這個(gè)規(guī)則就比較嚴(yán)格。
[任務(wù)的啟用和禁用]
每個(gè)task都有enabled
屬性策添,設(shè)置為false表示禁用材部。默認(rèn)是true。代碼表示方式有如下三種:
taskB.enabled = false
taskB.enabled false
taskB.enabled(false)
當(dāng)taskB禁用后唯竹,當(dāng)編譯工程時(shí)直接跳過(guò)taskB乐导,不執(zhí)行taskB。
[任務(wù)的onlyif斷言]
斷言就是一個(gè)條件表達(dá)式浸颓。Task有一個(gè)onlyIf方法物臂,它接受一個(gè)閉包作為參數(shù),如果該閉包返回true則執(zhí)行該任務(wù)产上,否則不執(zhí)行棵磷。
taskB.onlyIf {
def bb = false
//..經(jīng)過(guò)一些判斷
bb//返回值
}
看一下上面一段代碼,比較簡(jiǎn)單晋涣,返回值bb=false仪媒,那么taskB會(huì)被跳過(guò),不會(huì)被執(zhí)行谢鹊。當(dāng)然算吩,可以根據(jù)實(shí)際需求,在某些情況下將返回值設(shè)置為true佃扼,這樣taskB就會(huì)被執(zhí)行偎巢。
[任務(wù)規(guī)則]
假設(shè)taskA不存在,那么執(zhí)行taskA時(shí)會(huì)報(bào)錯(cuò)兼耀,報(bào)錯(cuò)信息如下:
我們現(xiàn)在不必關(guān)系具體報(bào)什么錯(cuò)压昼,只知道求冷,這些報(bào)錯(cuò)信息是默認(rèn)的一種規(guī)則
,那么窍霞,我們也可以自定義這種規(guī)則匠题,即:根據(jù)任務(wù)名稱指定規(guī)則,代碼如下:
tasks.addRule("規(guī)則一"){
String taskName -> task(taskName).doLast {
println "該${taskName}任務(wù)不存在"
}
}
當(dāng)再次執(zhí)行taskA時(shí)官撼,則新的報(bào)錯(cuò)信息如下:
[本章完...]