Android Gradle Groovy自動化構(gòu)建入門篇

Gradle系列分2章
上篇Android Gradle Groovy自動化構(gòu)建入門篇
下篇Android Gradle Groovy自動化構(gòu)建進(jìn)階篇

Gradle是一個基于Apache Ant和Apache Maven概念的項(xiàng)目自動化構(gòu)建工具。它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置。

為什么要學(xué)習(xí)它

我們知道主流的的構(gòu)建工具有Ant,Maven,那我們?yōu)槭裁催€要學(xué)習(xí)Gradle那?

  • Ant 只負(fù)責(zé) 編譯、測試、打包
  • Maven 新增依賴管理、發(fā)布,采用xml管理,xml配置項(xiàng)目大的話,容易啰嗦和臃腫
  • Gradle 采用Groovy管理,具有更高的靈活性和可擴(kuò)展性。
    所以我們很有必要一塊來學(xué)習(xí)一下。

手動安裝Gradle

1.確保已安裝JDK,在終端運(yùn)行

    $ java -version
    java version "1.8.0_121"    

2.從Gradle官網(wǎng)下載最新Gradle,然后解壓.
3.配置環(huán)境變量
* Linux和MacOS用戶
配置您的PATH環(huán)境變量以包含bin解壓縮分發(fā)的目錄:
$ export PATH=$PATH:/opt/gradle/gradle-4.4.1/bin
* Windows用戶
點(diǎn)擊:我的電腦- 屬性-高級屬性 —環(huán)境變量,
選擇下 CLASSPATH,然后編輯。添加
C:\Gradle\gradle-4.4.1\bin,點(diǎn)擊保存。
* 驗(yàn)證安裝
執(zhí)行$ gradle -v 如果出現(xiàn)了類似一下界面,

------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------ 

那么恭喜你,你已安裝成功,接下來我們就從Gradle的 基本語法開始,一起來揭開Gradle的神秘面紗吧。

Groovy基本語法理論介紹

前面我們知道Gradle是一種基于Groovy語言(DSL)來聲明的,所以我們很有必要先了解下Groovy 語言。Groovy 語言是用于Java虛擬機(jī)的敏捷語言,是可以用于面對對象編程,又可以用作純粹的腳本語言,同時有具有閉包和動態(tài)語言的其他特性。

基本特性:

1. Groovy 完全兼容java語法
2. 末尾的分號是可選的
3. 類、方法默認(rèn)是public的
4. 編譯器會自動添加getter/setter方法
5. 屬性可以用.號獲取
6. 最后一個表達(dá)式的值會作為返回值的
7. ==等同于equals(),不會有NullPointerExceptions

高效特性

1. assert 斷言語句 可以寫在任何地方
2. 可選類型定義,相當(dāng)于若類型語言 ,類型會自動推導(dǎo)出來的
3. 可選的括號 ,方法如過有有參數(shù),()可以不寫
4. 字符串 有三種 分別為 '' 、""、'''  '''
5. 閉包

Groovy 常用api

打開Ide工具新建工程,選擇new -- project —依次點(diǎn)擊


D4FA8425-0201-4DC5-8045-5BF238E3ECF2.png

EEEB527E-6D12-40B8-AE4C-E9CDE8FF8A3E.png

基本特性:

Snip20180114_3.png

高效特性

Snip20180114_4.png

閉包是一種代碼塊,叫做Closure,這是一種類似于C語言中函數(shù)指針的東西。用起來非常方便,在Groovy中閉包可以作為方法的參數(shù)和返回值,也可以作為一個變量賦值存在。
如何聲明閉包?

{ parameters ->
   code
}

閉包可以有返回值和參數(shù),當(dāng)然也可以沒有。下面是幾個具體的例子

//有參閉包,賦值給一個變量
def c1 = {
    v ->
        println v
}
//無參閉包,賦值給一個變量c2
def c2 = {
    println 'hello'
}
//c2閉包作為參數(shù)傳入方法method2中
method2(c2)

另外,如果閉包不指定參數(shù),那么它會有一個隱含的參數(shù) it,閉包是一個難點(diǎn)
建議多看官方API

def test = {
   println "隱含的參數(shù) ${it}, I am a closure!"
}
test(100)
outputs:
find 100, I am a closure! 

常用集合api

  • list
def fruits = ['apple', 'orange']//聲明
fruits << 'banana'//添加數(shù)據(jù)
fruits[0] = "gradle"http://集合中第一項(xiàng)重新賦值
println fruits[0]//根據(jù)key取出數(shù)據(jù)
println fruits.size
println fruits.getClass()

outputs:
gradle
3
class java.util.ArrayList

由此可以看出Groovy中國list就是java中的ArrayList<<表示向List中添加新元素

  • map
def dataSource = ['groupId': 1, 'year': '2017']//聲明
dataSource.groupName = '行業(yè)'//添加數(shù)據(jù)
dataSource['year'] = '2018'//更新數(shù)據(jù)
println dataSource['year']//獲取value
println dataSource.groupId//獲取value
println dataSource.size()
println dataSource.getClass()

outputs:
2018
1
3
class java.util.LinkedHashMap

由此可以看出Groovy中國map就是java中的LinkedHashMap,訪問key不僅可以通過map.獲取dataSource.groupName也通過map[key]獲取dataSource['year']獲取。
假如我們現(xiàn)在想采用Groovy方式遍歷和這個集合該怎么辦那?查文檔發(fā)現(xiàn)
[image:422EA4A3-C96F-40A7-9E74-3AD85AF88A43-4899-00001DBAD2F11AC4/Snip20180114_6.png]
可以發(fā)現(xiàn),這兩個each方法的參數(shù)都是一個閉包,如果我們傳遞的閉包是一個參數(shù),那么它就把entry作為參數(shù);如果我們傳遞的閉包是2個參數(shù),那么它就把key和value作為參數(shù)。
接下來我們遍歷上面的 dataSource

dataSource.each { key, value ->
    println "two parameters, find [${key} : ${value}]"
}
println()
dataSource.each {
    println "one parameters, find [${it.key} : ${it.value}]"
}

outputs:
two parameters, find [groupId : 1]
two parameters, find [year : 2018]
two parameters, find [groupName : 行業(yè)]

one parameters, find [groupId : 1]
one parameters, find [year : 2018]
one parameters, find [groupName : 行業(yè)]
  • 加強(qiáng)的IO
    在Groovy中,文件訪問要比Java簡單的多,不管是普通文件還是xml文件。

讀取普通文件

在根目錄下,新建a.txt
[image:88688DC4-000C-4FF4-8ABA-0234A13A2A84-4899-0000206B8BF3CA1E/C6E33E21-322F-4A1A-9AAA-835B7A00F0A5.png]
接下里我們就把a(bǔ).txt的文本按行取出來

def file = new File("a.txt")
file.eachLine {
    line,lineNo->
        println "${lineNo} ${line}"
}
file.eachLine { line ->
    println "${line}"
}

outputs:
1 hello
2 gradle
hello
gradle

除了eachLine外,F(xiàn)ile還提供了很多Java所沒有的方法,我們需要用的時候再去查就行了。

接下來讓我們在試下讀取xml文件

Groovy訪問xml有兩個類:XmlParser和XmlSlurper,二者幾乎一樣,查看官方demo如下

def xml = '<root><one a1="uno!"/><two>Some text!</two></root>'
 def rootNode = new XmlParser().parseText(xml)
 assert rootNode.name() == 'root'
 assert rootNode.one[0].@a1 == 'uno!'
 assert rootNode.two.text() == 'Some text!'
 rootNode.children().each { assert it.name() in ['one','two'] }

好了,今天是我們這個Gradle系列的第一篇文章,相信現(xiàn)在你已經(jīng)了解了Gradle的基本語法了,當(dāng)然也是一些最常用的用法。下一篇文章當(dāng)中,我們會介紹Gradle構(gòu)建腳本,自定義任務(wù),構(gòu)建生命周期,解決依賴沖突,多項(xiàng)目構(gòu)建等高階技巧。

如有疏漏,請指出不勝感激,如有問題可以通過如下方式聯(lián)系我

簡書
csdn
掘金
klvens跑碼場

最后編輯于
?著作權(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ù)。

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