Gradle 之詳解Task(四)

一赃梧、前言

Gradle在初始化階段會(huì)生成所有的Project對(duì)象,在配置階段會(huì)構(gòu)建Task有向無(wú)環(huán)圖新症,最后的執(zhí)行階段會(huì)執(zhí)行該Task和其相關(guān)的Task任務(wù)特咆。

這一章主要說(shuō)下毛俏,配置階段之前的Task的構(gòu)建和Task的執(zhí)行(沒(méi)有調(diào)用該Task也會(huì)讓配置階段執(zhí)行代碼執(zhí)行)宦赠。

二胸嘴、Task的定義

通過(guò)gradlew tasks可查看所有定義好的Task任務(wù)券犁。

Task定義方式:

1、Task task(String name,Closure configureClosure)

如:

task helloTask {
    println 'hello world'
}

等價(jià)于:
task (helloTask,{
    println 'hello world'
}) 

上面的調(diào)用:gradlew helloTask络断;強(qiáng)調(diào)一點(diǎn)的是該helloTask的執(zhí)行在配置階段中裁替。

2、TaskContainer getTasks() 通過(guò)容器

如:

this.getTasks().create(name:'helloTask') {
    println 'hello world'
}

每個(gè)Project中會(huì)有個(gè)TaskContainer對(duì)象貌笨,該對(duì)象是為了管理該P(yáng)roject下的所有的Task弱判。

無(wú)論通過(guò)第一個(gè)方式還是第二個(gè)方式都會(huì)有個(gè)XXXXX(Map<String, ?> options, Closure configureClosure),第一個(gè)參數(shù)options是什么意思锥惋?

我們通過(guò)task(String name,Closure configureClosure)方式創(chuàng)建的時(shí)候昌腰,第一個(gè)String name實(shí)質(zhì)也可以理解成map的方式,也就是說(shuō)map可以保存很多的設(shè)置屬性膀跌。而且這些設(shè)置屬性都在Task的聲明中剥哑。

public interface Task extends Comparable<Task>, ExtensionAware {
    String TASK_NAME = "name";

    String TASK_DESCRIPTION = "description";

    String TASK_GROUP = "group";

    String TASK_TYPE = "type";

    String TASK_DEPENDS_ON = "dependsOn";

    String TASK_OVERWRITE = "overwrite";

    String TASK_ACTION = "action";
}
  • name : Task名稱
  • description : Task描述
  • group : Task屬于哪個(gè)組
  • type : Task類型
  • dependsOn : Task依賴于其他的Task
  • overwrite :
  • action:

Task中除了定義屬性外,還有對(duì)該屬性的操作方法淹父,我們可以在創(chuàng)建Task的時(shí)候就對(duì)添加屬性,也可以通過(guò)獲取特定的屬性通過(guò)setXXX方法設(shè)置怎虫。

二暑认、Task的執(zhí)行

前面也已經(jīng)介紹了Task的執(zhí)行方式是調(diào)用gradlew task名方式,上面的Task定義的是執(zhí)行在配置階段的大审,而且及時(shí)沒(méi)有明確的被調(diào)用該Task中的代碼還是會(huì)在配置階段執(zhí)行蘸际。

Task可以通過(guò)配置的方式,讓其執(zhí)行在配置階段還是執(zhí)行階段徒扶。

1粮彤、doFirst{} : 執(zhí)行階段

添加doFirst代碼是執(zhí)行階段執(zhí)行;不添加表示在配置階段執(zhí)行姜骡。

如:可以在Task中添加doFirst导坟,也可以通過(guò)找到Task添加doFirst。

this.getTasks().create(name: 'helloTask',description: 'hahahha') {
    doFirst {
        def name = 'hello'
        println name
    }
}

helloTask.doFirst {
    println it.description
}
2圈澈、doLast{} : 執(zhí)行階段

在Task中通過(guò)添加doLast惫周,可以讓這部分代碼執(zhí)行在執(zhí)行階段

如:創(chuàng)建一個(gè)helloTask任務(wù),通過(guò)執(zhí)行該任務(wù)康栈,他的打印結(jié)果為:“world”递递,因?yàn)榕渲秒A段的先執(zhí)行喷橙,最后再順序執(zhí)行執(zhí)行階段內(nèi)容。

this.getTasks().create(name: 'helloTask',description: 'hahahha') {
    def name = 'hello'
    doLast {
        println name
    }
    name = 'world'
}

3登舞、<< : 執(zhí)行階段

當(dāng)Task中的代碼都執(zhí)行在執(zhí)行階段的時(shí)候贰逾,用<<來(lái)簡(jiǎn)寫(xiě)代替doLast

this.getTasks().create(name: 'helloTask',description: 'hahahha') << {
    def name = 'hello'
    println name
}

例子:計(jì)算執(zhí)行執(zhí)行階段到執(zhí)行階段結(jié)束時(shí)間

this.afterEvaluate { Project project->
    def startBuildTime,endBuildTime
    def preBuildTask = project.tasks.getByName('preBuild')
    def buildTask = project.tasks.getByName('build')

    preBuildTask.doFirst {
        startBuildTime = System.currentTimeMillis()
        println "preBuildTask time is ${startBuildTime}"
    }

    buildTask.doLast {
        endBuildTime = System.currentTimeMillis()
        println "preBuildTask time is ${endBuildTime}"
        println "執(zhí)行時(shí)間為: ${endBuildTime-startBuildTime}"
    }
}

二、Task的執(zhí)行順序

Task的執(zhí)行順序:

  • 1菠秒、dependOn方式設(shè)置
  • 2疙剑、輸入輸出方式
  • 3、通過(guò)API指定順序

1)稽煤、dependOn方式

如:

task taskZ << {
    println 'taskZ'
}

task taskX(dependsOn: taskZ) << {
    println 'taskX'
}

task taskY(dependsOn: [taskX,taskZ]) << {
    println 'taskY'
}

定義了taskX核芽、taskY和taskZ三個(gè)Task,并指定taskY依賴于taskX酵熙,而taskX依賴于taskZ轧简;當(dāng)執(zhí)行taskY的時(shí)候他們的輸出順序如下:

taskZ
taskX
taskY

2)、輸入輸出方式

當(dāng)一個(gè)參數(shù)作為TaskA的輸出參數(shù)匾二,卻作為TaskB的輸入?yún)?shù)哮独。那么當(dāng)執(zhí)行TaskB的時(shí)候先要執(zhí)行TaskA。即輸出的Task先于輸入的Task執(zhí)行察藐。
輸入方式:

  • TaskInputs property(String name, Object value);
  • TaskInputs properties(Map<String, ?> properties);

通過(guò)輸入一些鍵值對(duì)的方式皮璧,KEY為String類型,value為任意類型分飞。

輸出方式:

  • TaskOutputFilePropertyBuilder dirs(Object... paths);
  • TaskOutputFilePropertyBuilder file(Object path);
  • TaskOutputFilePropertyBuilder dir(Object path);

3)悴务、指定順序方式mustRunAfter

如:

task taskX << {
    doLast {
        println 'taskX'
    }

}

task taskY  {
    mustRunAfter(taskX)

    doLast {
        println 'taskY'
    }
}

task taskZ << {
    mustRunAfter(taskY)
    doLast {
        println 'taskZ'
    }

}

三、Gradle生命周期內(nèi)執(zhí)行Task

怎么樣通過(guò)代碼調(diào)用Task

this.afterEvaluate {
    def buildTask = it.tasks.findByName('build')
    if (buildTask != null) {
        buildTask.doLast {
            taskZ.execute()
        }
    }
}

在buildTask執(zhí)行中添加對(duì)taskZ的執(zhí)行譬猫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讯檐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子染服,更是在濱河造成了極大的恐慌别洪,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳刮,死亡現(xiàn)場(chǎng)離奇詭異挖垛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秉颗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門痢毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚕甥,你說(shuō)我怎么就攤上這事闸准。” “怎么了梢灭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵夷家,是天一觀的道長(zhǎng)蒸其。 經(jīng)常有香客問(wèn)我,道長(zhǎng)库快,這世上最難降的妖魔是什么摸袁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮义屏,結(jié)果婚禮上靠汁,老公的妹妹穿的比我還像新娘。我一直安慰自己闽铐,他們只是感情好蝶怔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兄墅,像睡著了一般踢星。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隙咸,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天沐悦,我揣著相機(jī)與錄音,去河邊找鬼五督。 笑死藏否,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的充包。 我是一名探鬼主播副签,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼基矮!你這毒婦竟也來(lái)了淆储?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愈捅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后慈鸠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蓝谨,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年青团,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了譬巫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡督笆,死狀恐怖芦昔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娃肿,我是刑警寧澤咕缎,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布珠十,位于F島的核電站,受9級(jí)特大地震影響凭豪,放射性物質(zhì)發(fā)生泄漏焙蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一嫂伞、第九天 我趴在偏房一處隱蔽的房頂上張望孔厉。 院中可真熱鬧,春花似錦帖努、人聲如沸撰豺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)污桦。三九已至,卻和暖如春姿搜,著一層夾襖步出監(jiān)牢的瞬間寡润,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工舅柜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梭纹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓致份,卻偏偏與公主長(zhǎng)得像变抽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氮块,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1滔蝉、今天重讀和菜頭的韭菜席地而坐击儡。在一個(gè)新興的場(chǎng)子,如果周圍找不到一根韭菜蝠引,那自己就是那根韭菜阳谍。這句話,剛好可以對(duì)...
    瘋芝麻閱讀 287評(píng)論 0 0
  • 作者:夫子音 作者篇第十 【原文】: “作者七人”螃概,伏羲矫夯、神農(nóng)、黃帝吊洼、堯训貌、舜、禹冒窍、湯递沪,制法興王之道豺鼻,非有述于人者也...
    泮溪秋玉閱讀 514評(píng)論 0 4
  • 我無(wú)法改變這個(gè)世界,這個(gè)世界也不會(huì)為我改變区拳。但我可以從心里改變對(duì)這個(gè)世界的看法來(lái)理解并去適應(yīng)這個(gè)世界拘领!
    游來(lái)游去的魚(yú)1240閱讀 234評(píng)論 0 4
  • 尊敬的劉珅宏導(dǎo)師,宋姜華導(dǎo)師現(xiàn)在好樱调。 親愛(ài)的家人們現(xiàn)在好约素,感恩一切的發(fā)生。 密訓(xùn)回來(lái)帶著滿滿的收獲能量回到來(lái) ...
    靜悟慧閱讀 138評(píng)論 0 1