學習 Android 有一段時間了,開發中經常使用到 Gradle ,但是不知道 Gradle 構建項目的原理,計劃花一點時間學習一下 Gradle 相關的知識。Gradle 是一個非常優秀的項目構建工具,其 DSL (領域特定語言) 基於 Groovy 實現,大部分功能通過插件的方式來實現,也可以自定義 Gradle 插件,下面開始入門 Gradle 系列的第一篇。
- 配置 Gradle 環境
- Gradle 版 Hello World
- Gradle Wrapper
- Gradle 日誌
- Gradle 命令行
- 總結
配置 Gradle 環境#
首先確保在環境變量中配置好 JAVA_HOME,使用如下命令查看是否配置:
java -version
執行結果如下圖所示:
準備一個 Gradle 版本,下載之後進行解壓,解壓之後的目錄說明如下:
bin:gradle批處理文件
docs:說明文檔
init.d:初始化的腳本文件
lib:相關庫
media:自帶的圖標資源
samples:案例
src:源文件
getting-started.html:入門指導鏈接
LICENSE
NOTICE
然後在環境變量中配置 GRADLE_HOME ,具體指的是 Gradle 的解壓目錄:
然後,添加將 GRADLE_HOME\bin 配置到 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 構建環境就搭建好了。
Gradle 版 Hello World#
學習任何一門語言,毫無疑問當然是運行 Hello World ,這裡實現一個 Hello World 的 Gradle 腳本,創建一個名為 build.gradle 的腳本,腳本內容如下:
task hello{
doLast{
println 'Hello world'
}
}
使用 gradle -q hello 命令執行上述腳本,結果如下:
PS E:\Gradle\study> gradle -q hello
Hello world
build.gradle 是 Gradle 默認的構建腳本文件,執行命令時會默認加載當前目錄下的 build.gradle 腳本文件,這個構建腳本定義了一個名為 hello 的任務(Task),裡面的 doLast 是 Task 中的一個 Action,當這個 Task 執行完畢之後要回調 doLast 裡面的代碼,使用 gradle 命令時的參數 -q 是指定輸出的日誌級別,關於 gradle 日誌輸出級別將在下文中介紹。
Gradle Wrapper#
Wrapper 是對 Gradle 的一層包裝,方便在團隊中統一管理 Gradle 的版本,項目開發中通常使用的 Wrapper 這種方式,使用 Wrapper 之後就不需要採用配置 Gradle 的構建環境的方式,使用 Wrapper 啟用 Gradle 的時候,Wrapper 會檢查 Gradle 有沒有下載關聯,如果沒有下載則從配置的地址下載並進行構建,這就一定程度上方便開發人員構建項目。
生成 Wrapper#
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 進行構建操作。
Wrapper 配置#
在使用 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 的值。
自定義 Wrapper Task#
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 構建項目時,可以指定日誌級別來顯示相關的日誌信息,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 日誌基本內容如上,多在實際項目中實踐才是最重要的。
Gradle 命令行#
使用命令行在一定程度上了解構建過程,相較在 IDE 上的便捷性,使用命令行可以知其然知其所以然,只要是可以使用命令行的,都可以通過幫助獲取命令來查看可執行的命令,參考如下:
gradle -h
gradle -?
gradle -help
可以通過如上命令查看可執行的命令。
查看可執行 Tasks#
這裡以 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
查看某個 Task 的幫助#
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 的學習希望能夠將這個系列寫完。