實(shí)例講解Gradle的生命周期與核心概念

Gradle是一個(gè)自動(dòng)化的構(gòu)建工具恕汇。要掌握好gradle的用法爽柒,我們需要先對它的生命周期和核心概念有所了解蹋订。
Gradle的核心概念有project和task布讹。Gradle的生命周期包括初始化琳拭、配置、執(zhí)行描验。
下面我們從一個(gè)實(shí)例來講解白嘁,在其生命周期的三個(gè)階段,針對project和task鹉梨,都分別做了什么竞川。

1. 工程目錄結(jié)構(gòu)

工程目錄結(jié)構(gòu)

2. 執(zhí)行命令

在命令行中執(zhí)行如下命令

$ gradle :projectA:childA1:world

:projectA:childA1:world標(biāo)識了一個(gè)task的路徑负饲。其中:projectA:childA1為project的路徑,world為該project中的一個(gè)task耕魄。
Gradle是如何找到對應(yīng)的project和task的呢?又是在什么時(shí)候執(zhí)行的task呢彭谁?

3. Gradle的生命周期

(1)Initialization-初始化階段

這個(gè)階段會(huì)執(zhí)行settings.gradle文件吸奴,創(chuàng)建project樹。
settings.gradle內(nèi)容如下:

//settings.gradle
println("initialization from settings")
include ":projectA:childA1"
include ":projectA:childA2"
include ":projectB"

:projectA:childA1表示childA1是projectA的子project缠局,根目錄對應(yīng)的是rootProject则奥。根據(jù)settings文件,最后創(chuàng)建的project樹如下:

project樹狀結(jié)構(gòu)

需要注意的是狭园,project的樹狀關(guān)系一般是和目錄結(jié)構(gòu)保持一致的读处,也可以不一致。比如我們可以在settings中寫

include “:projectA:projectB"

這樣的話唱矛,projectB的父project就變成了projectA档泽。如果這樣寫的話,會(huì)報(bào)錯(cuò)說找不到projectB揖赴,因?yàn)槟J(rèn)情況下Gradle會(huì)在projectA目錄下面找馆匿。我們可以用下面這句話改變project的路徑:

project(":projectA:projectB").projectDir = new File("projectB")

(2)Configuration-配置階段

初始化階段創(chuàng)建完了project,然后便會(huì)按照廣度優(yōu)先的順序燥滑,針對每個(gè)project對象渐北,執(zhí)行其中的build.gradle腳本。
我們的例子中build.gradle的內(nèi)容都一樣铭拧,如下所示:

// build.gradle

println "configuration ${project.path}”

task("hello").doLast{
    println("hello from ${project.path}")
}

task("world").doLast {
    println("world from ${project.path}")
}

tasks.getByName("world").dependsOn("hello")

task(“hello")其實(shí)就是在調(diào)用:projectA:childA1這個(gè)project對象的task方法赃蛛,這個(gè)project對象就是在前面的初始化階段創(chuàng)建的恃锉。task方法的作用是用來在project中創(chuàng)建一個(gè)task,task的名字為hello呕臂。

這個(gè)腳本中一共創(chuàng)建了兩個(gè)task破托,分別為hello和world。tasks是project中的一個(gè)字段歧蒋,類型為TaskContainer土砂。一個(gè)project 的所有task都會(huì)保存在這個(gè)TaskContainer中。接下來通過task的dependsOn方法谜洽,在hello和world之間創(chuàng)建了依賴關(guān)系萝映。
所有的task會(huì)形成一個(gè)有向無環(huán)圖。

println "configuration ${project.path}”, 這一句在該階段就會(huì)執(zhí)行阐虚,輸出一條日志序臂。
doLast是task的一個(gè)回調(diào)方法,該回調(diào)會(huì)在下面的執(zhí)行階段執(zhí)行实束。

(3)Excution-執(zhí)行階段

配置完了就到了執(zhí)行階段奥秆,我們要執(zhí)行的是projectA:childA1下的world task。gradle會(huì)根據(jù)task的依賴關(guān)系圖咸灿,從前往后執(zhí)行吭练。本例中的world task依賴于hello task,而hello不依賴與任何的task析显,所以先執(zhí)行hello鲫咽,然后再執(zhí)行world。這兩個(gè)task都屬于同一個(gè)project谷异,我們也可以在不同project的task之間建立依賴關(guān)系分尸。比如:

tasks.getByName("world").dependsOn(“:projectB:hello")

task有doFirst和doLast兩個(gè)關(guān)鍵方法,它們可以在task執(zhí)行前后追加命令歹嘹,構(gòu)成了兩個(gè)鏈表箩绍。比如:

tasks.getByName("world").doFirst {
    println "first 1"
}

tasks.getByName("world").doFirst {
    println "first 2"
}

tasks.getByName("world").doLast {
    println "last 1"
}

tasks.getByName("world").doLast {
    println "last 2"
}

最后的輸出是

first2
first1
last1
last2

注意是first2在first1之前執(zhí)行

  1. 輸出結(jié)果

我們最初的例子的輸出結(jié)果如下

輸出結(jié)果

從輸出的結(jié)果里面可以驗(yàn)證Gradle生命周期的三個(gè)階段。

參考資料:

Gradle的官網(wǎng)是最好的資料尺上,建議有英文閱讀能力的直接看官網(wǎng)
Gradle用戶手冊:https://docs.gradle.org/current/userguide/userguide.html
Gradle Build Lifecycle: https://docs.gradle.org/current/userguide/build_lifecycle.html#build_lifecycle_events

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末材蛛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怎抛,更是在濱河造成了極大的恐慌卑吭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件马绝,死亡現(xiàn)場離奇詭異豆赏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門掷邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白胀,“玉大人,你說我怎么就攤上這事抚岗』蚋埽” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵宣蔚,是天一觀的道長向抢。 經(jīng)常有香客問我,道長件已,這世上最難降的妖魔是什么笋额? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任元暴,我火速辦了婚禮篷扩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茉盏。我一直安慰自己鉴未,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布鸠姨。 她就那樣靜靜地躺著铜秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讶迁。 梳的紋絲不亂的頭發(fā)上连茧,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音巍糯,去河邊找鬼啸驯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祟峦,可吹牛的內(nèi)容都是我干的罚斗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宅楞,長吁一口氣:“原來是場噩夢啊……” “哼针姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厌衙,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤距淫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后婶希,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉愁,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拐揭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤蟆。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖堂污,靈堂內(nèi)的尸體忽然破棺而出家肯,到底是詐尸還是另有隱情,我是刑警寧澤盟猖,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布讨衣,位于F島的核電站,受9級特大地震影響式镐,放射性物質(zhì)發(fā)生泄漏反镇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一娘汞、第九天 我趴在偏房一處隱蔽的房頂上張望歹茶。 院中可真熱鬧,春花似錦你弦、人聲如沸惊豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尸昧。三九已至,卻和暖如春旷偿,著一層夾襖步出監(jiān)牢的瞬間烹俗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工萍程, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幢妄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓尘喝,卻偏偏與公主長得像磁浇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子朽褪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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