Gradle系列分2章
上篇Android Gradle Groovy自動化構建入門篇
下篇Android Gradle Groovy自動化構建進階篇
Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化構建工具。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,拋棄了基於XML的各種繁瑣配置。
為什麼要學習它
我們知道主流的的構建工具有Ant,Maven,那我們為什麼還要學習Gradle那?
- Ant 只負責 編譯、測試、打包
- Maven 新增依賴管理、釋出,採用xml管理,xml配置專案大的話,容易囉嗦和臃腫
- Gradle 採用Groovy管理,具有更高的靈活性和可擴充套件性。 所以我們很有必要一塊來學習一下。
手動安裝Gradle
1.確保已安裝JDK,在終端執行
$ java -version
java version "1.8.0_121"
複製程式碼
2.從Gradle官網下載最新Gradle,然後解壓.
3.配置環境變數
* Linux和MacOS使用者
配置您的PATH環境變數以包含bin解壓縮分發的目錄:
$ export PATH=$PATH:/opt/gradle/gradle-4.4.1/bin
* Windows使用者
點選:我的電腦- 屬性-高階屬性 —環境變數,
選擇下 CLASSPATH,然後編輯。新增
C:\Gradle\gradle-4.4.1\bin
,點選儲存。
* 驗證安裝
執行$ gradle -v
如果出現了類似一下介面,
------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------
複製程式碼
那麼恭喜你,你已安裝成功,接下來我們就從Gradle的 基本語法開始,一起來揭開Gradle的神祕面紗吧。
Groovy基本語法理論介紹
前面我們知道Gradle是一種基於Groovy語言(DSL)來宣告的,所以我們很有必要先了解下Groovy 語言。Groovy 語言是用於Java虛擬機器的敏捷語言,是可以用於面對物件程式設計,又可以用作純粹的指令碼語言,同時有具有閉包和動態語言的其他特性。
基本特性:
1. Groovy 完全相容java語法
2. 末尾的分號是可選的
3. 類、方法預設是public的
4. 編譯器會自動新增getter/setter方法
5. 屬性可以用.號獲取
6. 最後一個表示式的值會作為返回值的
7. ==等同於equals(),不會有NullPointerExceptions
複製程式碼
高效特性
1. assert 斷言語句 可以寫在任何地方
2. 可選型別定義,相當於若型別語言 ,型別會自動推匯出來的
3. 可選的括號 ,方法如過有有引數,()可以不寫
4. 字串 有三種 分別為 '' 、""、''' '''
5. 閉包
複製程式碼
Groovy 常用api
開啟Ide工具新建工程,選擇new -- project —依次點選
基本特性:
高效特性
閉包是一種程式碼塊,叫做Closure,這是一種類似於C語言中函式指標的東西。用起來非常方便,在Groovy中閉包可以作為方法的引數和返回值,也可以作為一個變數賦值存在。 如何宣告閉包?{ parameters ->
code
}
複製程式碼
閉包可以有返回值和引數,當然也可以沒有。下面是幾個具體的例子
//有參閉包,賦值給一個變數
def c1 = {
v ->
println v
}
//無參閉包,賦值給一個變數c2
def c2 = {
println 'hello'
}
//c2閉包作為引數傳入方法method2中
method2(c2)
複製程式碼
另外,如果閉包不指定引數,那麼它會有一個隱含的引數 it,閉包是一個難點 建議多看官方API
def test = {
println "隱含的引數 ${it}, I am a closure!"
}
test(100)
outputs:
find 100, I am a closure!
複製程式碼
常用集合api
- list
def fruits = ['apple', 'orange']//宣告
fruits << 'banana'//新增資料
fruits[0] = "gradle"//集合中第一項重新賦值
println fruits[0]//根據key取出資料
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 = '行業'//新增資料
dataSource['year'] = '2018'//更新資料
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']
獲取。
假如我們現在想採用Groovy方式遍歷和這個集合該怎麼辦那?查文件發現
[image:422EA4A3-C96F-40A7-9E74-3AD85AF88A43-4899-00001DBAD2F11AC4/Snip20180114_6.png]
可以發現,這兩個each方法的引數都是一個閉包,如果我們傳遞的閉包是一個引數,那麼它就把entry作為引數;如果我們傳遞的閉包是2個引數,那麼它就把key和value作為引數。
接下來我們遍歷上面的 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 : 行業]
one parameters, find [groupId : 1]
one parameters, find [year : 2018]
one parameters, find [groupName : 行業]
複製程式碼
- 加強的IO 在Groovy中,檔案訪問要比Java簡單的多,不管是普通檔案還是xml檔案。
讀取普通檔案
在根目錄下,新建a.txt
[image:88688DC4-000C-4FF4-8ABA-0234A13A2A84-4899-0000206B8BF3CA1E/C6E33E21-322F-4A1A-9AAA-835B7A00F0A5.png]
接下里我們就把a.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外,File還提供了很多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系列的第一篇文章,相信現在你已經瞭解了Gradle的基本語法了,當然也是一些最常用的用法。下一篇文章當中,我們會介紹Gradle構建腳