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)威指南舌劳。覺得對你有用帚湘,請支持原書。