Gradle之入門前奏(三)

筆記來源於以下文章
http://liuwangshu.cn/application/gradle/2-primer.html

這一篇文章我們接着來學習Gradle入門需要掌握的知識,包括配置環境、實現Hello World、Gradle的任務、Gradle日誌和Gradle命令行,掌握這些能夠更好的理解Gradle。

1. 配置Gradle環境

安裝Gradle前要確保系統已經配置好JDK的環境,要求JDK的版本在1.7或更高。
Gradle的安裝有兩種形式:

  1. 通過包管理安裝,比如Window平臺的Chocolatey、Scoop,Mac平臺的MacPortsl、Homebrew等等。
  2. 手動安裝。

關於包管理器安裝可以查看官方文檔 ,這裏主要介紹手動安裝,在https://gradle.org/releases/ 中下載你想要Gradle版本的binary-only。

1.1 Windows平臺安裝

和配置Java環境類似,在系統變量中添加GRADLE_HOME:

image

然後再將%GRADLE_HOME%\bin添加到path系統變量中就可以了,運行gradle -v命令來進行驗證。

image
image

1.2 Mac平臺安裝

步驟如下:

  1. 打開終端運行open -e .bash_profile,打開.bash_profile文件來配置環境變量。
  2. 在.bash_profile文件中將gradle路徑添加到path環境變量中,比如我的就是:
export PATH=$PATH:~/develop/gradle-4.10.1/bin
  1. 保存.bash_profile文件,在終端中運行source ~/.bash_profile,更新.bash_profile文件。

  2. 在終端上運行gradle -v命令,查看是否配置成功。

2. 實現Hello World

配置完Gradle環境後,按照慣例要實現Gradle的Hello World,這裏以Windows平臺爲例。
build.gradle爲Gradle默認的構建腳本文件,運行Gradle 命令時,會從當前目錄下尋找 build.gradle 文件來執行構建。

我們先新建一個目錄,比如D:\Gradle\gradle_demo,在這個目錄中新建一個 build.gradle 文件,輸入以下內容:

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

然後在該文件所在目錄下運行gradle -q hello構建腳本, 就會打印出“Hello world!”。

image

項目構建比較複雜,爲了使用各種開發語言的開發者都能夠快速的構建項目,專家們開發出了Gradle這個基於Groovy的DSL,DSL(Domain Specifc Language)意爲領域特定語言,只用於某個特定的領域。我們只要按照Groovy的DSL語法來寫,就可以輕鬆構建項目。

task(任務)和action(動作)是Gradle的重要元素。上面的代碼中,task代表一個獨立的原子性操作,比如複製一個文件,編譯一次Java代碼,這裏我們簡單的定義一個名爲hello的任務。doLast 代表task執行的最後一個action,通俗來講就是task執行完畢後會回調doLast中的代碼,在上面這個例子中就會打印 ‘Hello world!’

上面的例子還可以寫的更簡潔一些,操作符<< 是doLast方法的快捷版本,它們做了相同的事情,如下所示。

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

3. Gradle的任務

爲了更好的講解後面的Gradle 命令行,這裏簡單的介紹下Gradle的任務,包括創建任務、任務依賴、 動態定義任務和任務的分組和描述。

3.1 創建任務

除了第2節實現Hello World的例子採用的創建任務方式,還有其他的3種創建任務方式。

  1. 直接用任務名稱創建。
def Task hello=task(hello)
hello.doLast{
     println "hello world"
}
  1. 任務名稱+任務配置創建。
def Task hello=task(hello,group:BasePlugin.BUILD_GROUP)
hello.doLast{
    println("hello world")
}

其中group爲任務配置項,它代表了分組,關於分組會在3.4小節描述

  1. TaskContainer的create方法創建
tasks.create(name:"hello")<<{
//<<是doLast的快捷寫法
    println "hello world"
}

或者這樣

tasks.create("demo4").doLast{
    println "this is demo4"
}

此前創建任務的方式最終都會調用tasks的create方法,其中tasks類型爲TaskContainer。

3.2 任務依賴

任務依賴會決定任務運行的先後順序,被依賴的任務會在定義依賴的任務之前執行。創建任務間的依賴關係如下所示。

task hello << {
    println "Hello World"
}
task go(dependsOn: hello) << {
    println "go for it"
}

在hello任務的基礎上增加了一個名爲go的任務,通過dependsOn來指定依賴的任務爲hello,因此go任務運行在hello之後。
在當前文件夾打開DOS,鍵入gradle -q go執行腳本,結果如下:

Hello World
go for it

3.3 動態定義任務

動態定義任務指的是在運行時來定義任務的名稱,如下所示

3.times {number ->
    task task$number << {
        println "task $number"
    }
}

關於tasks可以查詢api
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/Number.html#times(groovy.lang.Closure)

image

 

這裏用到了Groovy語法,times是Groovy在java.lang.Number拓展的方法,是一個定時器,3.times中循環創建了三個新任務,隱式變量number的值爲0,1,2,任務的名稱由task加上number的值組成,達到了動態定義任務的目的。

運行gradle -q task1構建腳本,打印結果如下

task 1

3.4 任務的分組和描述

Gradle有任務組的概念,可以爲任務配置分組和描述,以便於更好的管理任務,擁有良好的可讀性。改造3.2小節的例子,爲hello任務添加分組和描述。

task hello {
    group = 'build'
    description = 'hello world'
    doLast {
        println "任務分組: ${group}"
        println "任務描述: ${description}"
    }
}
task go(dependsOn: hello) << {
    println "go for it"
}

也可以採用3.1小節中其他的創建任務方式來爲任務添加分組和描述,如下所示。

def Task hello=task(hello)
hello.description ='hello world'
hello.group=BasePlugin.BUILD_GROUP
hello.doLast{
    println "任務分組: ${group}"
    println "任務描述: ${description}"
}
task go(dependsOn: hello) << {
    println "go for it"
}

執行結果如下:

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q go1
任務分組: build
任務描述: Hello World
go for it

4. Gradle日誌級別

和Android一樣,Gradle也定義了日誌級別。

級別 用於
ERROR 錯誤消息
QUITE 重要的信息消息
WARNING 警告消息
LIFECYCLE 進度消息信息
INFO 信息性消息
DEBUG 調試消息

前面我們通過gradle -q +任務名稱來運行一個指定的task,這個q是命令行開關選項,通過開關選項可以控制輸出的日誌級別。

開關選項 輸出日誌級別
無日誌選項 LIFECYCLE及更高級別
-q 或 --quite QUITE及更高級別
-i 或 --info INFO及更高級別
-d 或 --debug DEBUG及更高級別

5. Gradle命令行

從命令行的角度,Gradle和Git類似,命令都可以用一些IDE、圖形工具來代替,但是如果你對Gradle 命令行熟悉,會幫助你更好的理解Gradle,高效的運用Gradle。

5.1 獲取所有任務信息

這一節的命令行以3.4小節的代碼爲例,此前我們通過gradle -q +任務名稱來運行一個指定的任務,如果不知道任務的名稱,可以通過運行gradle -q tasks命令或者gradle tasks --all來獲取所有的任務信息,這樣就不需要打開源碼了。

源碼如下:
build.gradle

 task demo1{
    group="build"
    description="Hello World"
    doLast{
        println "任務分組: ${group}"
        println "任務描述: ${description}"
    }
}  
task go1(dependsOn: demo1) << {
    println "go for it"
}

gradle -q tasks

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
demo1 - Hello World

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_demo'.
components - Displays the components produced by root project 'gradle_demo'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradle_demo'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_demo'.
dependentComponents - Displays the dependent components of components in root project 'gradle_demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle_demo'. [incubating]
projects - Displays the sub-projects of root project 'gradle_demo'.
properties - Displays the properties of root project 'gradle_demo'.
tasks - Displays the tasks runnable from root project 'gradle_demo'.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

這種默認情況下,只會顯示那些被分組的任務的名稱和描述。比如Build tasks(Build 任務組)中有我們定義的demo1任務,Build Setup tasks中有init和wrapper,Help tasks有buildEnvironment 和components等等。

gradle tasks --all

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle tasks --all

> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:9)
        (Run with --stacktrace to get the full stack trace of this deprecation warning.)

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
demo1 - Hello World

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_demo'.
components - Displays the components produced by root project 'gradle_demo'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradle_demo'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_demo'.
dependentComponents - Displays the dependent components of components in root project 'gradle_demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle_demo'. [incubating]
projects - Displays the sub-projects of root project 'gradle_demo'.
properties - Displays the properties of root project 'gradle_demo'.
tasks - Displays the tasks runnable from root project 'gradle_demo'.

Other tasks
-----------
go1


BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

5.2 排除任務

如果我們不想運行go任務,可以運行gradle hello -x go命令:
以5.1小結的源碼爲例

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q  go1 -x demo1
go for it

沒有執行demo1任務

5.3 獲取任務幫助信息

通過運行gradle -q help –task hello命令來顯示hello任務的幫助信息。
以3.4小結的源碼爲例

Detailed task information for hello

Path
     :hello

Type
     Task (org.gradle.api.Task)

Description
     hello world

Group
     build

可以看到hello任務的路徑、類型、描述和分組。

5.4 多任務調用

task helloWorld << {
    println 'Hello world!'
}
task goForit<< {
    println "go for it"
}

通過命令行一次執行多個任務,每個任務通常只會執行一次,無論是在命令行中指定任務還是任務依賴,上面的例子我們運行gradle helloWorld goForit,會先執行helloWorld任務後執行goForit任務。

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q helloWorld goForit
hello World
go for it

5.5 任務名稱縮寫

可以對使用駝峯命名的任務進行縮寫,對於名稱特別長的任務這個特性非常有用,比如5.4小節中的例子只需要執行gradle hW gF就可以了,不過需要注意一點,那就是任務名稱的縮寫必須是唯一的,如果5.4小節中第二個任務的名稱爲helloWangshu,那麼就會報錯。

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q hW gF
hello World
go for it
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章