第一章 Gradle入門

Gradle 是一款非常優(yōu)秀的構(gòu)建系統(tǒng)工具,它的 DSL 基于 Groovy 實現(xiàn),可以讓你很方便的通過代碼控制這些DSL來達(dá)到你構(gòu)建的目的,其構(gòu)建的大部分功能都是通過插件的方式來實現(xiàn)囚戚,所以非常靈活方便闷沥,如果內(nèi)置插件不能滿足你的需求你可以自定義自己的插件。

配置Gradle環(huán)境

Linux下搭建 Gradle 構(gòu)建環(huán)境

Gradle 可運行在所有主流的操作系統(tǒng)上暮芭,只需要安裝一個 Java JDK 或 JRE 8或更高版本即可。

運行 java -version 將檢查 Java 環(huán)境:

$ java -version
java version "1.8.0_121"

先到 Gradle 官網(wǎng) https://gradle.org/ 下載 Gradle。這里區(qū)分 binary-only 版或者 complete 版(with docs and sources)

將發(fā)行版 zip 文件解壓縮到你選擇的目錄中留攒,例如:

$ mkdir /opt/gradle
$ unzip -d /opt/gradle gradle-6.3-bin.zip

配置你的 PATH / 環(huán)境變量包含解壓縮發(fā)行版的 bin 目錄,例如:

GRADLE_HOME=/opt/gradle/gradle-6.3
PATH=$PATH:${GRADLE_HOME}/bin
export GRADLE_HOME PATH

要運行 Gradle嫉嘀,必須把 GRADLE_HOME/bin 目錄添加到你的環(huán)境變量 PATH 的路徑里才可以炼邀。在 Linux 下,如果你只想為你當(dāng)前登陸的用戶配置可以運行Gradle吃沪,那么可以編輯~/.bashrc文件添加以下內(nèi)容:然后在終端輸入 source ~/.bashrc 回車執(zhí)行讓剛剛的配置生效汤善。

如果你想讓所有用戶都可以使用gradle,那么你就需要在/etc/profile中添加以上內(nèi)容票彪,在這里添加后红淡,對所有用戶都生效,這種方式的添加降铸,必須要重啟電腦才可以

輸入gradle -v命令查看即可在旱,如果能正確顯示gradle版本號、Groovy版本號推掸、JVM等相關(guān)信息桶蝎,那么說明你已經(jīng)配置成功了.

Window下搭建Gradle構(gòu)建環(huán)境

環(huán)境變量配置項驻仅,添加 GRADLE_HOME 環(huán)境變量,然后把GRADLE_HOME\bin添加到PATH系統(tǒng)變量里保存即可登渣。完成后打開CMD運行g(shù)radle -v來進(jìn)行驗證噪服,整體和Linux差不多,這里就不在一一詳述胜茧。

Mac下搭建Gradle構(gòu)建環(huán)境

同 Linux 類似粘优。在終端中輸入:open -e ~/.bash_profile,打開.bash_profile文件

GRADLE_HOME=/Users/ale/opt/gradle/gradle-7.2
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin

Reload your terminal to see this change reflected or run the following command:
$ source ~/.bash_profile

Verify your installation

$ gradle -v

Gradle 版 Hello World

新建好一個目錄呻顽,然后在該目錄下創(chuàng)建一個名為 build.gradle 的文件雹顺,打開編輯該文件,輸入以下內(nèi)容:

task hello{
    doLast{
        println'Hello world!'
    }
}

cd 到對應(yīng)目錄廊遍,使用 gradle -q hello 命令來執(zhí)行構(gòu)建腳本:
gradle -q hello

看到gradle -q hello這段運行命令嬉愧,意思是要執(zhí)行build.gradle腳本中定義的名為hello的Task,-q參數(shù)用于控制gradle輸出的日志級別喉前,哪些日志可以輸出被看到没酣。

看到println 'Hello World!'了嗎,它會輸出Hello World!卵迂,通過名字相信大家已經(jīng)猜出來了四康,它其實就是System.out.println("Hello World!")的簡寫方式。Gradle 可以識別它狭握,是因為 Groovy 已經(jīng)把println() 這個方法添加到 java.lang.Object闪金,而在Groovy中,方法的調(diào)用可以省略簽名中的括號论颅,以一個空格分開即可哎垦,所以就有了上面的寫法。還有一點要說明的就是在Groovy中恃疯,單引號和雙引號所包含的內(nèi)容都是字符串漏设,不像 Java 中,單引號是字符今妄,雙引號才是字符串郑口。

Gradle Wrapper

Wrapper,顧名思義盾鳞,其實就是對Gradle的一層包裝犬性,便于在團(tuán)隊開發(fā)過程中統(tǒng)一Gradle構(gòu)建的版本,這樣大家都可以使用統(tǒng)一的Gradle版本進(jìn)行構(gòu)建腾仅,避免因為Gradle版本不統(tǒng)一帶來的不必要的問題乒裆。

Gradle提供了內(nèi)置的 wrapper task 幫助我們自動生成 wrapper 所需的目錄文件,在一個項目的根目錄推励,輸入gradle wrapper即可生成鹤耍。

生成的文件

gradlew 和 gradlew.bat 分別是 Linux 和 Window 下的可執(zhí)行腳本肉迫,他們的用法和gradle原生命令是一樣的,gradle 怎么用稿黄,他們也就可以怎么用喊衫。gradle-wrapper.jar是具體業(yè)務(wù)邏輯實現(xiàn)的jar包,gradlew 最終還是使用 java 執(zhí)行的這個jar包來執(zhí)行相關(guān) gradle 操作杆怕。gradle-wrapper.properties 是配置文件格侯,用于配置使用哪個版本的 gradle 等。

這些生成的wrapper文件可以作為你項目工程的一部分提交到代碼版本控制系統(tǒng)里(git)财著,這樣其他開發(fā)人員就會使用這里配置好的統(tǒng)一的gradle進(jìn)行構(gòu)建開發(fā)。

自定義Wrapper Task
前面我們講了撑碴,gradle-wrapper.properties 是由 wrapper task 生成的撑教,那么我們是否可以自定義配置該 Wrapper task 來達(dá)到我們配置 gradle-wrapper.properties的目的呢,答案是肯定的醉拓。我們可以在 build.gradle 構(gòu)建文件中錄入如下腳本:

這樣我們再執(zhí)行g(shù)radle wrapper的時候伟姐,就自定義了其他和默認(rèn)生成 2.4 版本的wrapper

Gradle日志

日志級別

日志級別
# 輸出 quiet 級別及其以上的日志
gradle -q tasks
# 輸出 info 級別及其以上的日志
gradle -i tasks

輸出錯誤堆棧信息

在使用 Gradle 構(gòu)建的時候,難免會有這樣或者那樣的問題導(dǎo)致你的構(gòu)建失敗亿卤,這時就需要你根據(jù)日志分析解決問題愤兵。除了以上的日志信息之外,Gradle還提供了堆棧信息的打印排吴,用過 Java 語言的相信大家都會很熟悉錯誤堆棧信息秆乳,他能幫助我們很好的定位和分析問題。

默認(rèn)情況下钻哩,堆棧信息的輸出是關(guān)閉的屹堰,需要我們通過命令行的堆棧信息開關(guān)打開它,這樣在我們構(gòu)建失敗的時候街氢,Gradle才會輸出錯誤堆棧信息扯键,便于我們定位分析和解決問題。

在編寫 Gradle 腳本的過程中珊肃,我們有時候需要輸出一些日志荣刑,來驗證我們的邏輯或者一些變量的值是否正確,這時候我們就可以使用Gradle提供的日志功能伦乔。
通常情況下我們一般都是使用print系列方法厉亏,把日志信息輸出到標(biāo)準(zhǔn)的控制臺輸出流(它被Gradle定向為QUIET級別日志)。

除了 print 系列方法之外烈和,你也可以使用內(nèi)置的 logger 更靈活的控制輸出不同級別的日志信息叶堆。

logger 說是內(nèi)置,其實是調(diào)用的 Project 的 getLogger() 方法獲取的 Logger 對象的實例斥杜。

Gradle命令行

記得使用幫助

命令行下的工具都有命令虱颗,剛開始我們不會用或者不知道有什么命令或者參數(shù)沥匈,這沒事,但是我們可以通過幫助來了解忘渔,基本上所有的命令行工具都有幫助高帖,查看幫助的方式也很簡單,基本上都是在命令后跟-h或者--help畦粮,有的時候會有-?,以Gradle Wrapper為例:

查看所有可執(zhí)行的Tasks

有時候我們不知道如何構(gòu)建一個功能散址,不知道執(zhí)行哪個Task,這時候就需要查看哪些Task可執(zhí)行宣赔,都具備什么功能预麸,通過運行./gradlew tasks命令

gradle help 任務(wù)

除了上面我們說的每個命令行都有幫助外,Gradle還內(nèi)置了一個help task儒将,這個help可以讓我們了解每一個task的使用幫助吏祸,
用法是 ./gradlew help --task <task name>,
比如 ./gradlew help --task tasks钩蚊,就可以顯示tasks任務(wù)的幫助信息:

強制刷新依賴
我們一個功能不可避免的會依賴很多第三方庫贡翘,像 Maven 這類工具都是有緩存的,因為不可能每次編譯的時候都要重新下載第三方庫砰逻,緩存就是這個目的鸣驱,先使用緩存,沒有再下載蝠咆。默認(rèn)情況下Maven這類工具會控制緩存的更新踊东,但是也有例外,比如 Version 一樣刚操,但是里面的代碼變了递胧;還有就是聯(lián)調(diào)測試時使用的snapshot 版本。以上兩種情況我們在實際項目中都遇到過赡茸,最后就是通過強制刷新解決的缎脾。

強制刷新很簡單,只要在命令行運行的時候加上--refresh-dependencies 參數(shù)就可以占卧,這是IDE很難做到的(需要你了解配置)遗菠,所以命令行的優(yōu)勢就體現(xiàn)出來了,非常簡單华蜒。

gradle --refresh-dependencies assemble

多任務(wù)調(diào)用

有時候我們需要同事運行多個任務(wù)辙纬,比如在執(zhí)行Jar之前先進(jìn)行 clean,那么我們就需要先執(zhí)行 clean 對 class文件清理叭喜,然后再執(zhí)行jar生成一個jar包贺拣。通過命令行執(zhí)行多個任務(wù)非常簡單,只需要按順序以空格分開即可,比如 gradle clean jar譬涡,這樣就可以了闪幽,有更多的任務(wù)時,可以繼續(xù)添加涡匀。

通過任務(wù)名字縮寫執(zhí)行執(zhí)行

有的時候我們的任務(wù)名字很長盯腌,Gradle提供了基于駝峰命名法的縮寫調(diào)用,比如 connectCheck陨瘩,我們執(zhí)行的時候可以使用 gradlew connectCheck, 也可以使用 gradlew cc這樣的方式來執(zhí)行腕够。

參考

本文純屬自學(xué)歷程 + 一些記錄,絕大部分內(nèi)容來自原書 Android Gradle權(quán)威指南舌劳。覺得對你有用帚湘,請支持原書。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甚淡,一起剝皮案震驚了整個濱河市大诸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌材诽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恒傻,死亡現(xiàn)場離奇詭異脸侥,居然都是意外死亡,警方通過查閱死者的電腦和手機盈厘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門睁枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沸手,你說我怎么就攤上這事外遇。” “怎么了契吉?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵跳仿,是天一觀的道長。 經(jīng)常有香客問我捐晶,道長菲语,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任惑灵,我火速辦了婚禮山上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘英支。我一直安慰自己佩憾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妄帘,像睡著了一般楞黄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寄摆,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天谅辣,我揣著相機與錄音,去河邊找鬼婶恼。 笑死桑阶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勾邦。 我是一名探鬼主播蚣录,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眷篇!你這毒婦竟也來了萎河?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕉饼,失蹤者是張志新(化名)和其女友劉穎虐杯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧港,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡擎椰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了创肥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片达舒。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叹侄,靈堂內(nèi)的尸體忽然破棺而出巩搏,到底是詐尸還是另有隱情,我是刑警寧澤趾代,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布贯底,位于F島的核電站,受9級特大地震影響撒强,放射性物質(zhì)發(fā)生泄漏丈甸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一尿褪、第九天 我趴在偏房一處隱蔽的房頂上張望睦擂。 院中可真熱鬧,春花似錦杖玲、人聲如沸顿仇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼闻。三九已至鸿吆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間述呐,已是汗流浹背惩淳。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乓搬,地道東北人思犁。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像进肯,于是被迫代替她去往敵國和親激蹲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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