第一章 Gradle入門

Gradle 是一款非常優秀的構建系統工具,它的 DSL 基于 Groovy 實現,可以讓你很方便的通過代碼控制這些DSL來達到你構建的目的,其構建的大部分功能都是通過插件的方式來實現,所以非常靈活方便,如果內置插件不能滿足你的需求你可以自定義自己的插件。

配置Gradle環境

Linux下搭建 Gradle 構建環境

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

運行 java -version 將檢查 Java 環境:

$ java -version
java version "1.8.0_121"

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

將發行版 zip 文件解壓縮到你選擇的目錄中,例如:

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

配置你的 PATH / 環境變量包含解壓縮發行版的 bin 目錄,例如:

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

要運行 Gradle,必須把 GRADLE_HOME/bin 目錄添加到你的環境變量 PATH 的路徑里才可以。在 Linux 下,如果你只想為你當前登陸的用戶配置可以運行Gradle,那么可以編輯~/.bashrc文件添加以下內容:然后在終端輸入 source ~/.bashrc 回車執行讓剛剛的配置生效。

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

輸入gradle -v命令查看即可,如果能正確顯示gradle版本號、Groovy版本號、JVM等相關信息,那么說明你已經配置成功了.

Window下搭建Gradle構建環境

環境變量配置項,添加 GRADLE_HOME 環境變量,然后把GRADLE_HOME\bin添加到PATH系統變量里保存即可。完成后打開CMD運行gradle -v來進行驗證,整體和Linux差不多,這里就不在一一詳述。

Mac下搭建Gradle構建環境

同 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

新建好一個目錄,然后在該目錄下創建一個名為 build.gradle 的文件,打開編輯該文件,輸入以下內容:

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

cd 到對應目錄,使用 gradle -q hello 命令來執行構建腳本:
gradle -q hello

看到gradle -q hello這段運行命令,意思是要執行build.gradle腳本中定義的名為hello的Task,-q參數用于控制gradle輸出的日志級別,哪些日志可以輸出被看到。

看到println 'Hello World!'了嗎,它會輸出Hello World!,通過名字相信大家已經猜出來了,它其實就是System.out.println("Hello World!")的簡寫方式。Gradle 可以識別它,是因為 Groovy 已經把println() 這個方法添加到 java.lang.Object,而在Groovy中,方法的調用可以省略簽名中的括號,以一個空格分開即可,所以就有了上面的寫法。還有一點要說明的就是在Groovy中,單引號和雙引號所包含的內容都是字符串,不像 Java 中,單引號是字符,雙引號才是字符串。

Gradle Wrapper

Wrapper,顧名思義,其實就是對Gradle的一層包裝,便于在團隊開發過程中統一Gradle構建的版本,這樣大家都可以使用統一的Gradle版本進行構建,避免因為Gradle版本不統一帶來的不必要的問題。

Gradle提供了內置的 wrapper task 幫助我們自動生成 wrapper 所需的目錄文件,在一個項目的根目錄,輸入gradle wrapper即可生成。

生成的文件

gradlew 和 gradlew.bat 分別是 Linux 和 Window 下的可執行腳本,他們的用法和gradle原生命令是一樣的,gradle 怎么用,他們也就可以怎么用。gradle-wrapper.jar是具體業務邏輯實現的jar包,gradlew 最終還是使用 java 執行的這個jar包來執行相關 gradle 操作。gradle-wrapper.properties 是配置文件,用于配置使用哪個版本的 gradle 等。

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

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

這樣我們再執行gradle wrapper的時候,就自定義了其他和默認生成 2.4 版本的wrapper

Gradle日志

日志級別

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

輸出錯誤堆棧信息

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

默認情況下,堆棧信息的輸出是關閉的,需要我們通過命令行的堆棧信息開關打開它,這樣在我們構建失敗的時候,Gradle才會輸出錯誤堆棧信息,便于我們定位分析和解決問題。

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

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

logger 說是內置,其實是調用的 Project 的 getLogger() 方法獲取的 Logger 對象的實例。

Gradle命令行

記得使用幫助

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

查看所有可執行的Tasks

有時候我們不知道如何構建一個功能,不知道執行哪個Task,這時候就需要查看哪些Task可執行,都具備什么功能,通過運行./gradlew tasks命令

gradle help 任務

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

強制刷新依賴
我們一個功能不可避免的會依賴很多第三方庫,像 Maven 這類工具都是有緩存的,因為不可能每次編譯的時候都要重新下載第三方庫,緩存就是這個目的,先使用緩存,沒有再下載。默認情況下Maven這類工具會控制緩存的更新,但是也有例外,比如 Version 一樣,但是里面的代碼變了;還有就是聯調測試時使用的snapshot 版本。以上兩種情況我們在實際項目中都遇到過,最后就是通過強制刷新解決的。

強制刷新很簡單,只要在命令行運行的時候加上--refresh-dependencies 參數就可以,這是IDE很難做到的(需要你了解配置),所以命令行的優勢就體現出來了,非常簡單。

gradle --refresh-dependencies assemble

多任務調用

有時候我們需要同事運行多個任務,比如在執行Jar之前先進行 clean,那么我們就需要先執行 clean 對 class文件清理,然后再執行jar生成一個jar包。通過命令行執行多個任務非常簡單,只需要按順序以空格分開即可,比如 gradle clean jar,這樣就可以了,有更多的任務時,可以繼續添加。

通過任務名字縮寫執行執行

有的時候我們的任務名字很長,Gradle提供了基于駝峰命名法的縮寫調用,比如 connectCheck,我們執行的時候可以使用 gradlew connectCheck, 也可以使用 gradlew cc這樣的方式來執行。

參考

本文純屬自學歷程 + 一些記錄,絕大部分內容來自原書 Android Gradle權威指南。覺得對你有用,請支持原書。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容