每個Gradle構(gòu)建都包括三個基本的構(gòu)建塊:項目(projects)、任務(wù)(tasks)和屬性(properties),每個構(gòu)建至少包括一個項目,項目包括一個或者多個任務(wù),項目和任務(wù)都有很多個屬性來控制構(gòu)建過程。
Gradle運用了領(lǐng)域驅(qū)動的設(shè)計理念(DDD)來給自己的領(lǐng)域構(gòu)建軟件建模,因此Gradle的項目和任務(wù)都在Gradle的API中有一個直接的class來表示,接下來我們來深入了解每一個組件和它對應(yīng)的API。
在Gradle術(shù)語里項目表示你想構(gòu)建的一個組件(比如一個JAR文件),或者你想完成的一個目標(biāo)(比如打包app),如果你以前使用過Maven,你應(yīng)該聽過類似的概念。與Maven pom.xml相對應(yīng)的是build.gradle文件,每個Gradle腳本至少定義了一個項目。當(dāng)開始構(gòu)建過程后,Gradle基于你的配置實例化org.gradle.api.Project這個類以及讓這個項目通過project變量來隱式的獲得。下圖列出了API接口和最重要的方法。
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag24.png" alt="" />
一個項目可以創(chuàng)建新任務(wù)、添加依賴和配置、應(yīng)用插件和其他腳本,許多屬性比如name和description都是可以通過getter和setter方法來訪問。
Project實例允許你訪問你項目所有的Gradle特性,比如任務(wù)的創(chuàng)建和依賴了管理,記住一點當(dāng)訪問你項目的屬性和方法時你并不需要顯式的使用project變量--Gradle假定你的意思是Project實例,看看下面這個例子:
//沒有使用project變量來設(shè)置項目的描述
setDescription("myProject")
//使用Grovvy語法來訪問名字和描述
println "Description of project $name: " + project.description
在之前的章節(jié),我們只處理到單個peoject的構(gòu)建,Gradle支持多項目的構(gòu)建,軟件設(shè)計一個很重要的概念是模塊化,當(dāng)一個軟件系統(tǒng)變得越復(fù)雜,你越想把它分解成一個個功能性的模塊,模塊之間可以相互依賴,每個模塊有自己的build.gradle腳本。
我們在第二章的時候就創(chuàng)建了一些簡單的任務(wù),你應(yīng)該了解兩個概念:任務(wù)動作(actions)和任務(wù)依賴,一個動作就是任務(wù)執(zhí)行的時候一個原子的工作,這可以簡單到打印hello world,也可以復(fù)雜到編譯源代碼。很多時候一個任務(wù)需要在另一個任務(wù)之后執(zhí)行,尤其是當(dāng)一個任務(wù)的輸入依賴于另一個任務(wù)的輸出時,比如項目打包成JAR文件之前先要編譯成class文件,讓我們來看看Gradle API中任務(wù)的表示:org.gradle.api.Task 接口。
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag25.png" alt="" />
每個Project和Task實例都提供了setter和getter方法來訪問屬性,屬性可以是任務(wù)的描述或者項目的版本號,在后續(xù)的章節(jié),你會在具體例子中讀取和修改這些屬性值,有時候你要定義你自己的屬性,比如,你想定義一個變量來引用你在構(gòu)建腳本中多次使用的一個文件,Gradle允許你通過外部屬性來定義自己的變量。
外部屬性一般存儲在鍵值對中,要添加一個屬性,你需要使用ext命名空間,看一個例子:
//Only initial declaration of extra property requires you to use ext namespace
project.ext.myProp = 'myValue'
ext {
someOtherProp = 123
}
//Using ext namespace to access extra property is optional
assert myProp == 'myValue'
println project.someOtherProp
ext.someOtherProp = 567
相似的,外部屬性可以定義在一個屬性文件中:
通過在
exampleProp = myValue
someOtherProp = 455
你可以在項目中訪問這兩個變量:
assert project.exampleProp == 'myValue'
task printGradleProperty << {
println "Second property: $someOtherProp"
}
定義屬性的其他方法
你也可以通過下面的方法來定義屬性:
ORG_GRADLE_PROJECT_propertyName=someValue