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