本文轉(zhuǎn)自這里许饿,感謝原作者的知識貢獻(xiàn)胖烛。
任務(wù)是 Gradle 構(gòu)建中的兩個(gè)基本概念之一产雹,而任務(wù)的定義和使用有多種形式谬莹,以下就給大家介紹幾個(gè)task 的定義和使用檩奠。
1 定義任務(wù)基本語法
// 使用task 后帶任務(wù)名稱 加上執(zhí)行閉包{}
task t1 {
println 't1'
}
// 任務(wù)名稱后加上圓括號
task t2() {
println 't2'
}
// IDEA 刷新 Task 點(diǎn)擊 build 或 左下 Terminal 輸入 gradle build 即可看到結(jié)果
t1
t2
以上是任務(wù)的基本定義,結(jié)果得知會(huì)在配置 project
階段時(shí)被執(zhí)行附帽。除了任務(wù)依賴埠戳,任何涉及到需要配置 project 對象的操作都會(huì)被執(zhí)行。如果需要在任務(wù)調(diào)用時(shí)才執(zhí)行動(dòng)作代碼需要定義在 doFirst
或者 doLast
方法中蕉扮。
2 任務(wù)的常見定義方式
task t1{
// 任務(wù)調(diào)用前執(zhí)行動(dòng)作
doFirst{
println 't1'
}
}
// 任務(wù)調(diào)用后執(zhí)行動(dòng)作
task t2(){
doLast{
println 't2'
}
}
// << 是 doLast 的簡寫整胃,任務(wù)調(diào)用后執(zhí)行動(dòng)作
task t3 << {
println 't3'
}
// 可給任務(wù)名帶 ' '
測試:gradle t1 t2 t3
> Task :t1
t1
> Task :t2
t2
> Task :t3
t3
以上為任務(wù)的最常見的定義方式,配置project 時(shí)不會(huì)調(diào)用 doFirst 和 doLast 中的方法喳钟。只有在直接調(diào)用任務(wù)或被其他任務(wù)依賴時(shí)才會(huì)被執(zhí)行屁使。那這里說的依賴到底怎么依賴呢? 以下就來看下任務(wù)的依賴配置奔则。
任務(wù)的依賴配置 dependsOn
任務(wù)的依賴需要使用一個(gè)關(guān)鍵字 dependsOn 來做依賴配置蛮寂,配置有多種形式,以下就來給大家演示下常見的用法
task t1 {
doFirst {
println 't1'
}
}
// 定義任務(wù)時(shí)指明依賴
task t2(dependsOn : t1) {
doLast {
println 't2'
}
}
task t3 << {
println 't3'
}
task t4 {
dependsOn t3 // 任務(wù)內(nèi)寫依賴
doLast{
println 't4'
}
}
// 外部添加依賴 t1 依賴 t3
t1.dependsOn t4
// 外部增加任務(wù)動(dòng)作達(dá)到依賴
t3.doFirst{
println '給 t3 增加增加動(dòng)作1'
}
t3 << {
println '給 t3 增加增加動(dòng)作2'
}
執(zhí)行任務(wù) t2 gradle t2 ,結(jié)果如下:
Task :t3
給 t3 增加增加動(dòng)作1
t3
給 t3 增加增加動(dòng)作2
Task :t4
t4
Task :t1
t1
Task :t2
t2
以上就是 task 常見的幾種依賴的書寫方式易茬,那 task 還有沒有什么高級點(diǎn)的語法特性呢酬蹋?
其實(shí)有的,借助 Groovy 的強(qiáng)大不僅可以定義簡單任務(wù)還能做更多的事抽莱。例如范抓,可以動(dòng)態(tài)定義任務(wù)。
動(dòng)態(tài)任務(wù)
4.times {
val ->
task "tk${val}" << {
println "The task is task${val}"
}
}
以上就動(dòng)態(tài)定義了4個(gè)任務(wù)tk0,tk1,tk2,tk3,那除了動(dòng)態(tài)任務(wù)還有哪些高級牛逼的操作呢食铐?其實(shí)還可以給任務(wù)自定義屬性匕垫。
3 給任務(wù)自定義屬性
這里使用 ext 來給任務(wù)添加額外屬性,用 ext.屬性名 = 值
來自定義虐呻。
// 給任務(wù)添加屬性
task tk5{
ext.myProperty = "The property value"
}
// 獲取自定義屬性
task printTaskProperty << {
println tk5.myProperty
}
// ============== 結(jié)果 ===================
> Task : printTaskProperty
The property value
還有木有象泵?
其實(shí)任務(wù)這里只是介紹了一些常用的操作而已,想了解更深入的知識點(diǎn)铃慷,請期待任務(wù) task 詳講单芜,這里是帶大家先入門的蜕该。
接下來用一個(gè)例子來鞏固下任務(wù)犁柜。
4 例子
需求:自定義任務(wù)來自動(dòng)生成項(xiàng)目目錄。
// 定義創(chuàng)建目錄的普通方法
def createDir(fileName){
File f = new File(fileName);
f.mkdirs()
}
// 定義生成Java 項(xiàng)目目錄的任務(wù)
task createJavaProjectDir << {
def dirList = ['src/main/java','src/main/resources','src/test/java','src/test/resources']
dirList.each {fileName -> createDir(fileName)}
}
// 定義生成 Web 項(xiàng)目目錄的任務(wù)
task createWebProjectDir (dependsOn: createJavaProjectDir) << {
def fileName = 'src/main/webapp'
createDir(fileName)
}
其實(shí) Java 組件中已經(jīng)事先定義好了堂淡,咱們只需要直接調(diào)用就行了馋缅。
task createDirs << {
sourceSets*.java.srcDirs*.each{
it.mkdirs()
}
sourceSets*.resources.srcDirs*.each{
it.mkdirs()
}
}
以上就是Gradle 中任務(wù)的介紹和任務(wù)的實(shí)踐扒腕。