Gradle系列之初識Gradle

學(xué)習(xí) Android 有一段時間了,開發(fā)中經(jīng)常使用到 Gradle ,但是不知道 Gradle 構(gòu)建項(xiàng)目的原理,計(jì)劃花一點(diǎn)時間學(xué)習(xí)一下 Gradle 相關(guān)的知識。Gradle 是一個非常優(yōu)秀的項(xiàng)目構(gòu)建工具,其 DSL(領(lǐng)域特定語言)基于 Groovy 實(shí)現(xiàn),大部分功能通過插件的方式來實(shí)現(xiàn),也可以自定義 Gradle 插件,下面開始入門 Gradle 系列的第一篇,內(nèi)容如下:

  1. 配置 Gradle 環(huán)境
  2. Gradle 版 Hello World
  3. Gradle Wrapper
  4. Gradle 日志
  5. Gradle 命令行
  6. 總結(jié)

配置 Gradle 環(huán)境

首先確保在環(huán)境變量中配置好 JAVA_HOME,使用如下命令查看是否配置:

java -version

執(zhí)行日志如下:


在這里插入圖片描述

準(zhǔn)備一個 Gradle 版本,下載之后進(jìn)行解壓,解壓之后的目錄說明如下:

bin:gradle批處理文件
docs:說明文檔
init.d:初始化的腳本文件
lib:相關(guān)庫
media:自帶的圖標(biāo)資源
samples:案例
src:源文件
getting-started.html:入門指導(dǎo)鏈接
LICENSE
NOTICE

然后在環(huán)境變量中配置 GRADLE_HOME ,具體指的是 Gradle 的解壓目錄:

在這里插入圖片描述

然后,添加將 GRADLE_HOME\bin 配置到 Path 中,具體如下:

在這里插入圖片描述

然后打開控制臺,使用命令 gradle -v 查看 Gradle 版本信息,如果能夠正確顯示 Gradle 版本號、Groovy 版本號、JVM 等相關(guān)信息,說明 Gradle 環(huán)境已經(jīng)配置成功,配置成功 gradle -v 執(zhí)行結(jié)果參考如下:

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 構(gòu)建環(huán)境就搭建好了。

Gradle 版 Hello World

學(xué)習(xí)任何一門語言,毫無疑問當(dāng)然是運(yùn)行 Hello World ,這里實(shí)現(xiàn)一個 Hello World 的 Gradle 腳本,創(chuàng)建一個名為 build.gradle 的腳本,腳本內(nèi)容如下:

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

使用 gradle -q hello 命令執(zhí)行上述腳本,結(jié)果如下:

PS E:\Gradle\study> gradle -q hello
Hello world

build.gradle 是 Gradle 默認(rèn)的構(gòu)建腳本文件,執(zhí)行命令時會默認(rèn)加載當(dāng)前目錄下的 build.gradle 腳本文件,這個構(gòu)建腳本定義了一個名為 hello 的任務(wù)(Task),里面的 doLast 是 Task 中的一個 Action,當(dāng)這個 Task 執(zhí)行完畢之后要回調(diào) doLast 里面的代碼,使用 gradle 命令時的參數(shù) -q 是指定輸出的日志級別,關(guān)于 gradle 日志輸出級別將在下文中介紹。

Gradle Wrapper

Wrapper 是對 Gradle 的一層包裝,方便在團(tuán)隊(duì)中統(tǒng)一管理 Gradle 的版本,項(xiàng)目開發(fā)中通常使用的 Wrapper 這種方式,使用 Wrapper 之后就不需要采用配置 Gradle 的構(gòu)建環(huán)境的方式,使用 Wrapper 啟用 Gradle 的時候,Wrapper 會檢查 Gradle 有沒有下載關(guān)聯(lián),如果沒有下載則從配置的地址下載并進(jìn)行構(gòu)建,這就一定程度上方便開發(fā)人員構(gòu)建項(xiàng)目。

生成 Wrapper

Gradle 提供了內(nèi)置的 Wrapper Task 來生成 Wrapper 所需的目錄文件,在相應(yīng)的目錄執(zhí)行 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 下的可執(zhí)行腳本,使用方式和原生的 gradle 命令一樣,gradle-wrapper.jar 是根據(jù)具體業(yè)務(wù)實(shí)現(xiàn)的 jar 包,gradlew 最終還是通過這個 jar 包來執(zhí)行相關(guān)的 gradle 相關(guān)操作,gradle-wrapper.properties 是用來配置使用哪一個版本的 gradle 進(jìn)行構(gòu)建操作。

Wrapper 配置

在使用 gradle wrapper 生成相關(guān)文件的時候,可以指定 wrapper 要使用的版本號以及 gradle 的下載地址,命令如下:

//指定使用的Gradle版本
gradle wrapper --gradle-version 3.3
//指定下載Gradle的地址
gradle wrapper --gradle-distribution-url ...

Gradle 默認(rèn)的版本是當(dāng)前 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的下載地址,一般是官網(wǎng)地址

下面是一個 Android 項(xiàng)目的 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
//表示項(xiàng)目目錄,項(xiàng)目底下 gradlew 所在的目錄
PROJECT

這兩個值可以用來設(shè)置 distributionBase 和 zipStoreBase 的值

自定義 Wrapper Task

Gradle 的配置文件 gradle-wrapper.properties 是由 Wrapper Task 生成的,可以不通過自定義 Wrapper Task 可以用來配置 gradle-wrapper.properties 文件,下面是自定義 Wrapper Task 的一個實(shí)例,

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 版本及相關(guān)存儲目錄。

Gradle 日志

使用 Gradle 構(gòu)建項(xiàng)目時,可以指定日志級別來顯示相關(guān)的日志信息,Gradle 的日志級別主要有六種,具體如下:

ERROR //錯誤消息
QUIET //重要消息
WARNING //警告消息
LIFECYCLE //進(jìn)度消息
INFO //信息消息
DEBUG //調(diào)試信息

使用時可以通過命令行的方式控制日志顯示級別,下面是可以使用命令控制的日志選項(xiàng),具體如下:

-q 或 --quiet //表示QUIET及其更高級別
-i 或 --info //表示INFO及其更高級別
-d 或 --debug //DEBUG 及其更高級別(輸出所有日志)

如果不指定,則默認(rèn)輸出的日志是 LIFECYCLE 及其更高級別的日志。

日志主要跟蹤構(gòu)建過程以及調(diào)試錯誤,下面介紹在項(xiàng)目構(gòu)建過程中堆棧信息的輸出以及如何使用日志信息來進(jìn)行調(diào)試。

輸出堆棧信息

默認(rèn)情況下,堆棧信息的輸出是關(guān)閉的,可以通過命令行的堆棧信息開關(guān)打開它,當(dāng)構(gòu)建失敗后,Gradle 會將輸出錯誤的堆棧信息,方便定位和分析問題,具體如下:

-s 或 --stacktrace //輸出關(guān)鍵性的堆棧信息
-S 或 --full--stacktrace //輸出全部堆棧信息

一般使用 -s 就可以了。

日志信息調(diào)試

最簡單的日志記錄當(dāng)然是在合適的位置打印想要看的變量即可,可以使用 print 系列方法將日志輸出到控制臺,這屬于 QUIET 級別的日志,也可以使用內(nèi)置的 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 日志基本內(nèi)容如上,多在實(shí)際項(xiàng)目中實(shí)踐才是最重要的。

Gradle 命令行

使用命令行在一定程度上了解構(gòu)建過程,相較在 IDE 上的便捷性,使用命令行可以知其然知其所以然,只要是可以使用命令行的,都可以通過幫助獲取命令來查看可執(zhí)行的命令,參考如下:

gradle -h
gradle -?
gradle -help

可以通過如上命令查看可執(zhí)行的命令。

查看可執(zhí)行 Tasks

這里以 Wrapple 為例,可以使用 ./gradlew tasks 查看可執(zhí)行的 Tasks,執(zhí)行結(jié)果以分組形式輸出,一個是關(guān)于構(gòu)建的(Build Setup tasks),另一個是關(guān)于幫助的(Help tasks),執(zhí)行結(jié)果如下:

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 內(nèi)置一個 help task,這個 Task 可以可以了解某一個 Task 的使用幫助,具體命令如下:

//命令格式
gradle help --task Task名稱
//舉例
gradle help --task projects

執(zhí)行結(jié)果參考如下:

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 的幫助信息可以看到當(dāng)前 Task 的分組、類型以及額外參數(shù)。

此外,開發(fā)中常常使用第三方庫,那么如何強(qiáng)制刷新第三方依賴呢,使用命令構(gòu)建項(xiàng)目的時候添加參數(shù) --refresh-dependencies,有時候需要同時運(yùn)行多個任務(wù),可將具體的任務(wù)使用空格分開,如 ./gradlew t1 t2,Gradle 提供了基于駝峰命名法的縮寫調(diào)用,可以使用如下方式簡寫調(diào)用:

//Task
newTask
//命令
./gradlew nt

總結(jié)

這是初識 Gradle 的第一篇文章,主要對 Gradle 及相關(guān)命令有了一定的了解,也是以后學(xué)習(xí) Gradle 構(gòu)建項(xiàng)目的基礎(chǔ),后續(xù)文章繼續(xù) Gradle 系列。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容