前提: 安裝Gradle。安裝過程非常簡單:
(1)下載Gradle
(2)將GRADLE_HOME/bin/gradle加入$PATH。
1. 基本概念(Project 和 Task)
Gradle中有兩個(gè)基本的概念:project和task。每個(gè)Gradle的構(gòu)建由一個(gè)project構(gòu)成,它代表著需要被構(gòu)建的組件或者構(gòu)建的整個(gè)項(xiàng)目。每個(gè)project由一個(gè)或者多個(gè)task組成。task代表著Gradle構(gòu)建過程中可執(zhí)行的最小單元。例如當(dāng)構(gòu)建一個(gè)組件時(shí),可能需要先編譯、打包、然后再生成文檔或者發(fā)布等,這其中的每個(gè)步驟都可以定義成一個(gè)task。
2. 構(gòu)建第一個(gè)Task
和Ant運(yùn)行時(shí)讀取build.xml類似,Gradle運(yùn)行時(shí)默認(rèn)會(huì)讀取build.gradle這個(gè)文件, 當(dāng)然你也可以使用參數(shù)"-b"來指定其他的xxx.gradle
下面,讓我們新建一個(gè)build.gradle文件,然后輸入如下內(nèi)容:
task hello {
doLast{
println "hello world"
}
}
這個(gè)構(gòu)建的腳本很簡單,就是輸出hello world。為了運(yùn)行這個(gè)構(gòu)建,我們應(yīng)該在當(dāng)前目錄下執(zhí)行 "gradle hello",即gradle TaskName。
doLast意思是定義一個(gè)行為(映射Gradle中的Action類),放在當(dāng)前task的最后,類似的,還有doFirst, 表示將定義的行為放在當(dāng)前task最前面,例如
task hello {
doLast{
println "Hello world"
}
doFirst{
println "I am xxx"
}
}
執(zhí)行g(shù)radle hello, 將輸出
"I am xxx"
"Hello world"
另外,你也可以使用如下更簡潔的方式來定義task:
task hello << {
println "hello world"
}
這里也許大家可能會(huì)覺得很奇怪,為什么可以用"<<"來定義Task的執(zhí)行內(nèi)容呢,還是讓我們看看Gradle的代碼是怎么實(shí)現(xiàn)的吧:
1 public abstract class AbstractTask implements TaskInternal, DynamicObjectAware {
2 private List<Action<? super Task>> actions = new ArrayList<Action<? super Task>>();
3
4 public Task doFirst(Action<? super Task> action) {
5 if (action == null) {
6 throw new InvalidUserDataException("Action must not be null!");
7 }
8 actions.add(0, wrap(action));
9 return this;
10 }
11
12 public Task doLast(Action<? super Task> action) {
13 if (action == null) {
14 throw new InvalidUserDataException("Action must not be null!");
15 }
16 actions.add(wrap(action));
17 return this;
18 }
從上面的代碼可以看出,Task類里有個(gè)Action的集合actions,當(dāng)使用doFirst或者doLast時(shí),實(shí)際上是將定義的執(zhí)行部分實(shí)例化成Action的對(duì)象,然后添加到actions集合里。
明白了這一點(diǎn),接下來讓我們看看為什么可以使用<<定義Task--------Groovy作為強(qiáng)大的支持DSL的動(dòng)態(tài)語言,早已經(jīng)重載了 << 操作符,使得我們可以方便的使用<<向集合添加元素。
說道這,相信真相已經(jīng)大白了:原來就是使用Groovy的特性,往集合里添加Action而已。對(duì),這就是Gradle的語法,利用Groovy的DSL特性,幫助我們更容易的定義我們的構(gòu)建腳本。
不過也許大家會(huì)覺得,這個(gè)例子實(shí)在是沒有什么代表性,只是一個(gè)簡單的 hello world,說明不了什么問題。好吧,別著急,下次我們會(huì)繼續(xù)研究Gradle的其他部分,不過先記住:作為一個(gè)構(gòu)建工具,Gradle真的很強(qiáng)大哦!