原文發於微信公衆號jzman-blog,歡迎關注交流。
學習 Android 有一段時間了,開發中常常使用到 Gradle ,可是不知道 Gradle 構建項目的原理,計劃花一點時間學習一下 Gradle 相關的知識。Gradle 是一個很是優秀的項目構建工具,其 DSL(領域特定語言)基於 Groovy 實現,大部分功能經過插件的方式來實現,也能夠自定義 Gradle 插件,下面開始入門 Gradle 系列的第一篇,內容以下:html
首先確保在環境變量中配置好 JAVA_HOME,使用以下命令查看是否配置:java
java -version
執行日誌以下:api
準備一個 Gradle 版本,下載以後進行解壓,解壓以後的目錄說明以下:微信
bin:gradle批處理文件 docs:說明文檔 init.d:初始化的腳本文件 lib:相關庫 media:自帶的圖標資源 samples:案例 src:源文件 getting-started.html:入門指導連接 LICENSE NOTICE
而後在環境變量中配置 GRADLE_HOME ,具體指的是 Gradle 的解壓目錄:app
而後,添加將 GRADLE_HOMEbin 配置到 Path 中,具體以下:工具
而後打開控制檯,使用命令 gradle -v 查看 Gradle 版本信息,若是可以正確顯示 Gradle 版本號、Groovy 版本號、JVM 等相關信息,說明 Gradle 環境已經配置成功,配置成功 gradle -v 執行結果參考以下:學習
PS E:\Gradle\study> gradle -v ------------------------------------------------------------ Gradle 4.1 ------------------------------------------------------------ Build time: 2017-08-07 14:38:48 UTC Revision: 941559e020f6c357ebb08d5c67acdb858a3defc2 Groovy: 2.4.11 Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015 JVM: 1.8.0_91 (Oracle Corporation 25.91-b14) OS: Windows 10 10.0 amd64
此時,Window 上的 Gradle 構建環境就搭建好了。測試
學習任何一門語言,毫無疑問固然是運行 Hello World ,這裏實現一個 Hello World 的 Gradle 腳本,建立一個名爲 build.gradle 的腳本,腳本內容以下:gradle
task hello{ doLast{ println 'Hello world' } }
使用 gradle -q hello 命令執行上述腳本,結果以下:ui
PS E:\Gradle\study> gradle -q hello Hello world
build.gradle 是 Gradle 默認的構建腳本文件,執行命令時會默認加載當前目錄下的 build.gradle 腳本文件,這個構建腳本定義了一個名爲 hello 的任務(Task),裏面的 doLast 是 Task 中的一個 Action,當這個 Task 執行完畢以後要回調 doLast 裏面的代碼,使用 gradle 命令時的參數 -q 是指定輸出的日誌級別,關於 gradle 日誌輸出級別將在下文中介紹。
Wrapper 是對 Gradle 的一層包裝,方便在團隊中統一管理 Gradle 的版本,項目開發中一般使用的 Wrapper 這種方式,使用 Wrapper 以後就不須要採用配置 Gradle 的構建環境的方式,使用 Wrapper 啓用 Gradle 的時候,Wrapper 會檢查 Gradle 有沒有下載關聯,若是沒有下載則從配置的地址下載並進行構建,這就必定程度上方便開發人員構建項目。
Gradle 提供了內置的 Wrapper Task 來生成 Wrapper 所需的目錄文件,在相應的目錄執行 gradle wrapper 命令便可生成,參考以下:
PS E:\Gradle\study> gradle wrapper BUILD SUCCESSFUL in 3s 1 actionable task: 1 executed PS E:\Gradle\study> cd wrapper
使用 gradle wrapper 生成的文件目錄以下:
│─gradlew │─gradlew.bat └─gradle └─wrapper gradle-wrapper.jar gradle-wrapper.properties
其中 gradlew 和 gradlew.bat 分別是 Linux 和 Window 下的可執行腳本,使用方式和原生的 gradle 命令同樣,gradle-wrapper.jar 是根據具體業務實現的 jar 包,gradlew 最終仍是經過這個 jar 包來執行相關的 gradle 相關操做,gradle-wrapper.properties 是用來配置使用哪個版本的 gradle 進行構建操做。
在使用 gradle wrapper 生成相關文件的時候,能夠指定 wrapper 要使用的版本號以及 gradle 的下載地址,命令以下:
//指定使用的Gradle版本 gradle wrapper --gradle-version 3.3 //指定下載Gradle的地址 gradle wrapper --gradle-distribution-url ...
Gradle 默認的版本是當前 Gradle 的版本,下載地址參考以下:
https\://services.gradle.org/distributions/gradle-4.1-all.zip
下面來看一看 Gradle 的配置文件 gradle-wrapper.properties 的幾個字段含義:
distributionBase //下載的Gradle壓縮包解壓後存儲的主目錄 distributionPath //相對於distributionBase解壓後壓縮包的路徑 zipStoreBase //相對於distributionBase存放Gradle壓縮包的 zipStorePath //相對於distributionPath存放Gradle壓縮包的 distributionUrl //Gradle的下載地址,通常是官網地址
下面是一個 Android 項目的 Gradle 的配置文件,參考以下:
#Mon Dec 28 10:00:20 PST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
順便介紹一下幾個屬性值:
//表示用戶目錄,用戶目錄下 .gradle 下的目錄 GRADLE_USER_HOME //表示項目目錄,項目底下 gradlew 所在的目錄 PROJECT
這兩個值能夠用來設置 distributionBase 和 zipStoreBase 的值
Gradle 的配置文件 gradle-wrapper.properties 是由 Wrapper Task 生成的,能夠不經過自定義 Wrapper Task 能夠用來配置 gradle-wrapper.properties 文件,下面是自定義 Wrapper Task 的一個實例,
task wrapper(type: Wrapper){ gradleVersion = '3.3' distributionBase='GRADLE_USER_HOME' distributionPath='wrapper/dists' //注意不要這樣寫:https\://services... distributionUrl="https://services.gradle.org/distributions/gradle-3.3-all.zip" }
這樣能夠定義生成 Wrapper 的 Gradle 版本及相關存儲目錄。
使用 Gradle 構建項目時,能夠指定日誌級別來顯示相關的日誌信息,Gradle 的日誌級別主要有六種,具體以下:
ERROR //錯誤消息 QUIET //重要消息 WARNING //警告消息 LIFECYCLE //進度消息 INFO //信息消息 DEBUG //調試信息
使用時能夠經過命令行的方式控制日誌顯示級別,下面是可使用命令控制的日誌選項,具體以下:
-q 或 --quiet //表示QUIET及其更高級別 -i 或 --info //表示INFO及其更高級別 -d 或 --debug //DEBUG 及其更高級別(輸出全部日誌)
若是不指定,則默認輸出的日誌是 LIFECYCLE 及其更高級別的日誌。
日誌主要跟蹤構建過程以及調試錯誤,下面介紹在項目構建過程當中堆棧信息的輸出以及如何使用日誌信息來進行調試。
默認狀況下,堆棧信息的輸出是關閉的,能夠經過命令行的堆棧信息開關打開它,當構建失敗後,Gradle 會將輸出錯誤的堆棧信息,方便定位和分析問題,具體以下:
-s 或 --stacktrace //輸出關鍵性的堆棧信息 -S 或 --full--stacktrace //輸出所有堆棧信息
通常使用 -s 就能夠了。
最簡單的日誌記錄固然是在合適的位置打印想要看的變量便可,可使用 print 系列方法將日誌輸出到控制檯,這屬於 QUIET 級別的日誌,也可使用內置的 logger 來控制不一樣級別日誌的顯示,及 DEBUG 輸出日誌最完整、ERROR 輸出日誌最少,使用方式參考以下:
//日誌測試 task hello{ doLast{ println 'Hello world' print 'Hi' logger.quiet('quiet 日誌') logger.lifecycle('lifecycle 日誌') logger.error('error 日誌') logger.info('info 日誌') logger.warn('warn 日誌') logger.debug('debug 日誌') } }
Gradle 日誌基本內容如上,多在實際項目中實踐纔是最重要的。
使用命令行在必定程度上了解構建過程,相較在 IDE 上的便捷性,使用命令行能夠知其然知其因此然,只要是可使用命令行的,均可以經過幫助獲取命令來查看可執行的命令,參考以下:
gradle -h gradle -? gradle -help
能夠經過如上命令查看可執行的命令。
這裏以 Wrapple 爲例,可使用 ./gradlew tasks 查看可執行的 Tasks,執行結果以分組形式輸出,一個是關於構建的(Build Setup tasks),另外一個是關於幫助的(Help tasks),執行結果以下:
PS E:\Gradle\study\wrapper> ./gradlew tasks :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Build Setup tasks ----------------- init - Initializes a new Gradle build. [incubating] wrapper - Generates Gradle wrapper files. [incubating] Help tasks ---------- components - Displays the components produced by root project 'wrapper'. [incubating] dependencies - Displays all dependencies declared in root project 'wrapper'. dependencyInsight - Displays the insight into a specific dependency in root project 'wrapper'. help - Displays a help message. model - Displays the configuration model of root project 'wrapper'. [incubating] projects - Displays the sub-projects of root project 'wrapper'. properties - Displays the properties of root project 'wrapper'. tasks - Displays the tasks runnable from root project 'wrapper'. To see all tasks and more detail, run gradlew tasks --all To see more detail about a task, run gradlew help --task <task> BUILD SUCCESSFUL Total time: 8.4 secs
Gradle 內置一個 help task,這個 Task 能夠能夠了解某一個 Task 的使用幫助,具體命令以下:
//命令格式 gradle help --task Task名稱 //舉例 gradle help --task projects
執行結果參考以下:
PS E:\Gradle\study\wrapper> gradle help --task projects > Task :help Detailed task information for projects Path :projects Type ProjectReportTask (org.gradle.api.tasks.diagnostics.ProjectReportTask) Description Displays the sub-projects of root project 'wrapper'. Group help BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
經過 Task 的幫助信息能夠看到當前 Task 的分組、類型以及額外參數。
此外,開發中經常使用第三方庫,那麼如何強制刷新第三方依賴呢,使用命令構建項目的時候添加參數 --refresh-dependencies,有時候須要同時運行多個任務,可將具體的任務使用空格分開,如 ./gradlew t1 t2,Gradle 提供了基於駝峯命名法的縮寫調用,可使用以下方式簡寫調用:
//Task newTask //命令 ./gradlew nt
這是初識 Gradle 的第一篇文章,主要對 Gradle 及相關命令有了必定的瞭解,也是之後學習 Gradle 構建項目的基礎,後續文章繼續 Gradle 系列,能夠關注公衆號:jzman-blog,一塊兒交流學習。