Gradle 入門

Gradle基本原理

Gradle 是一種以 Groovy 語言為基礎的自動化構建工具五鲫,一般通過修改 build.gradle 腳本來完成對項目構建的一些設置岔擂,例如依賴管理等等。大多數情況下塑崖,我們只需要稍微修改下 gradle 文件即可完成自己的需求阔蛉。

android中的 build.gradle 文件弃舒,或者其他后綴為 gradle 的文件其實就是個配置文件,就好像 xml 一樣苗踪,我們在 gradle 文件中修改各種配置參數削锰,Gradle 通過這些參數來實例化 Project 等等就像構造器一樣。

當我們新建一個項目后器贩,Gradle 默認會生成一些編譯腳本文件,主要有:setting.gradle吧黄、build.gradle 以及子項目中的 build.gradle 等等,還會在當前目錄下生成一個 gradle 文件夾拗慨,下面分別介紹一些這些文件的作用:

  • setting.gradle 用來告訴 gradle 這個項目包含了那些子項目奉芦。
  • build.gradle 是默認的構建腳本,當我們在執(zhí)行 gradle 命令時声功,會首先到當前目錄下尋找該文件,然后通過該文件的配置實例化一個 Project 對象其爵。
  • 自動生成的 gradle 文件夾是 Gradle 包裝器筹裕,其中包含一個 jar 文件和一個 配置文件,使用這個包裝器可以讓 Gradle 運行在一個特定的版本上朝卒,目的是創(chuàng)造一個獨立于系統(tǒng)、系統(tǒng)配置和 Gradle 版本的可靠和可重復構建抗斤。

Gradle 中有兩個重要的概念,分別是 ProjectTask龙宏,Project 表示一個正在構建的項目伤疙,而 Task 表示某一個具體的任務辆影。

Project

Project 表示正在構建的項目黍特,每個 Project 都對應一個我們在 setting.gradle 中配置的 Project蛙讥,除此之外還有一個 Root Project灭衷。

Project 用來管理、描述當前正在構建的項目迫像,我們可以通過其中提供的 api 進行一些操作來達到自己的目的瞳遍。

一個 Project 可以創(chuàng)建新的 Task,添加依賴關系和配置傅蹂,并應用插件和其他的構建腳本。

另外份蝴,Project 是通過我們常見的 build.gradle 文件實例化出來的氓轰,我們在 build.gradle 文件中進行的各種配置最終都會應用到 Project 中去。

Property

Project 本身提供了一些默認的屬性案糙,我們也可以向 Project 中添加自定義的屬性靴庆。添加屬性通過 ext 函數設置。

[圖片上傳失敗...(image-bbb548-1585911431257)]

Gradle 生命周期

Task 的運行與 Gradle 的生命周期息息相關炉抒,所以在此之前先介紹一下 Gradle 構建的生命周期,無論什么時候執(zhí)行 Gradle 構建拿诸,都會依次運行三個不同的生命周期階段:

  • 初始化
    在初始化階段塞茅,Gradle 會解析 setting.gradle 文件獲取該項目包含幾個子項目,然后創(chuàng)建一個 RootProject 以及分別為子項目創(chuàng)建 Project 實例野瘦。
  • 配置
    初始化完成后進入配置階段,此時會加載所有 build.gradle 文件配置及插件,然后執(zhí)行所有 Task 的配置代碼塊蠢络。
  • 執(zhí)行
    執(zhí)行指的就是依據順序執(zhí)行所有 Task 的動作迟蜜。

無論是單獨運行某一個 Task,還是運行所有的 Task娜睛,Gradle 的生命周期都是固定為上述的三個步驟,只不過執(zhí)行的時候會有選擇的執(zhí)行指定 Task 及其依賴的 Task方库,這意味著如果一個 Task 設置了在配置階段執(zhí)行某項任務障斋,即使運行了別的 Task,該任務也會被執(zhí)行垃环。

Task

Task 定義了一個當前任務執(zhí)行時的最小單元,一個 Project 中一般會存在很多個 Task遂庄,通過執(zhí)行這些 Task 來完成整個項目的構建。也就是說秸谢,項目構建的實際工作是由一個個的 Task 來完成的霹肝。

Task 的特征

Task 具備如下幾個特征。

1. 可以依賴于別的 Task
有時候我們期望該 Task 在某個 Task 執(zhí)行之后再執(zhí)行沫换,此時可以使用 dependsOn 方法來設置依賴關系,讓 Task 按照順序執(zhí)行刊棕。

2. 不同時機的 Task 動作:onConfig(配置塊)待逞、doFirst甥角、doLast识樱、action
Task 具備自己的執(zhí)行周期震束,我們可以選擇在不同的時機做不同的事情当犯。
onConfig(配置塊) 表示項目的配置階段,也就是上述生命周期中的配置階段嘉栓,Task 中的配置代碼塊將會被執(zhí)行。
doFirst 以及 doLast 是指在 Task 的動作(action)執(zhí)行前或執(zhí)行后定義的動作侵佃。
action 指執(zhí)行階段被運行的代碼塊奠支。

3. 輸入/輸出
Gradle 通過比較 兩個構建 task 的 inputs 和 outputs 來決定是否是最新的。如果 inputs 和 outputs 沒有發(fā)生變化倍谜,則認為 task 是最新的,因此答毫,只有當 inputs 和 outputs 不同時您旁,task 才會運行,否則將會跳過鹤盒。

4. 一些 getter/setter 屬性
除此之外侦副,Task 中提供了很多屬性,我們可以通過 get/set 方法來獲取或者設置秦驯。

Task 的創(chuàng)建與使用

下面我們來定義一個 Task:

[圖片上傳失敗...(image-8e7275-1585911431257)]

上述代碼比較簡單,配置階段會創(chuàng)建一個變量亲桥,然后在 doFirst 中賦值固耘,doLast 中打印出來,運行結果如下:

> Configure project :
printVersion on config
> Task :printVersion
prepare version
version:1

doLast 方法還有個等價的方法:leftShift 可以簡寫為 <<

printVersion << {
    println("on <<")
}

Task 的動作除了上面代碼定義的三種外還有一個 action 的動作厅目,可以使用注解 @TaskAction 來實現:

class PrintVersion extends DefaultTask{
    @TaskAction
    void start(){
        println("on action")
    }
}

Gradle 提供了很多種創(chuàng)建 Task 的方式:

task printVersion{}
project.task("printVersion"){}
project.tasks.create("printVersion"){}

我們可以通過 api 靈活的根據場景創(chuàng)建 Task法严。
下面再用一個例子總結一下上述內容:

project.task("task1"){
    println "task1 on config"
    doLast {
        println "task1 doLast"
    }
}

project.tasks.create("task2"){
    println "task2 on config"
    doLast {
        println "task2 doLast"
    }
}

task task3{
    println "task3 on config"
    doLast {
        println "task3 doLast"
    }
}

task3.dependsOn('task2')//設置 task3 依賴 task2

輸入命令:gradlew task3深啤,運行 task3路星,結果如下:

C:\xx\xx\xx>gradlew task3
> Configure project :
task1 on config
task2 on config
task3 on config

> Task :task2
task2 doLast

> Task :task3
task3 doLast

我們在運行 task3 時,Gradle 會先初始化然后進入配置階段洋丐,此時不管我們運行的是哪一個 task,既然構建進入了配置階段就意味著會配置所有的 task垫挨,所以即使我們只運行了 task3,另外兩個 task 也都打印了 on config哀峻。

然后進入執(zhí)行階段哲泊,我們看到執(zhí)行順序是 task2 ——> task3,是因為代碼中設置了 task3 依賴 task2切威,Gradle 在執(zhí)行某個 task 時會先執(zhí)行它依賴的 task 鏈表。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末缰冤,一起剝皮案震驚了整個濱河市喳魏,隨后出現的幾起案子,更是在濱河造成了極大的恐慌刺彩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡害,死亡現場離奇詭異畦攘,居然都是意外死亡,警方通過查閱死者的電腦和手機念搬,發(fā)現死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門摆出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來首妖,“玉大人,你說我怎么就攤上這事象踊∨锉冢” “怎么了杯矩?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵史隆,是天一觀的道長曼验。 經常有香客問我,道長鬓照,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任拒秘,我火速辦了婚禮臭猜,結果婚禮上,老公的妹妹穿的比我還像新娘蔑歌。我一直安慰自己,他們只是感情好丐膝,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布帅矗。 她就那樣靜靜地躺著,像睡著了一般浑此。 火紅的嫁衣襯著肌膚如雪滞详。 梳的紋絲不亂的頭發(fā)上紊馏,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天蒲犬,我揣著相機與錄音,去河邊找鬼原叮。 笑死,一個胖子當著我的面吹牛擂送,可吹牛的內容都是我干的。 我是一名探鬼主播嘹吨,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼境氢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匹厘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愈诚,失蹤者是張志新(化名)和其女友劉穎牛隅,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體媒佣,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡默伍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了炼蹦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡掐隐,死狀恐怖钞馁,靈堂內的尸體忽然破棺而出匿刮,到底是詐尸還是另有隱情,我是刑警寧澤熟丸,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布膝擂,位于F島的核電站,受9級特大地震影響架馋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜萍启,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一屏鳍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钓瞭,春花似錦、人聲如沸山涡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞溉。三九已至瘾带,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熟菲,已是汗流浹背看政。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抄罕,地道東北人帽衙。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像贞绵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恍飘,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容