原文位址 http://www.gradle.org/docs/current/userguide/writing_build_scripts.html
13.1. The Gradle build language建構語言
Gradle提供了一種“領域專用語言”(domain specific language) 或者 DSL對建構進行描述。這種語言基于Groovy,并加入了其他特性使得描述更簡單。
13.2. The Project API
在第七章
Chapter 7, Java Quickstart我們以
apply()
方法為例做了描述。咦,這個方法哪來的?當時我們說腳本定義了工程,對于每一個工程Gradle會建立一個
Project
型的執行個體并将該對象執行個體和建構腳本進行關聯。當建構腳本執行時會配置這個對象:
Getting help writing build scripts
嗨嗨别忘了建構腳本是Groovy代碼,用的是Gradle API。而
Project
接口就是你最先要了解的通路Gradle API的工具。是以要了解什麼标簽可用,就得去看
Project
接口的文檔.
- 腳本中調用的任何方法如果在基本中無定義,都委托給Project對象。
- 屬性的通路同上。
咱們試着通路
name屬性看看
。
Example 13.1. Accessing property of the Project object
build.gradle
println name
println project.name
Output of
gradle -q check
> gradle -q check
projectApi
projectApi
哇唔,倆
println
語句都打出了同一個屬性。前者是自動委托了
Project對象,對于沒在腳本裡定義的屬性施行。後者使用了工程命來關聯
Project對象。
如果你定義的屬性和
Project的成員一樣了,那就必須使用工程名進行界定了。
13.2.1. Standard project properties标準屬性
Project對象提供了幾個标準屬性,下面列出了一些常用的:
Table 13.1. Project Properties
Name | Type | Default Value |
| | The instance |
| | The name of the project directory. |
| | The absolute path of the project. |
| | A description for the project. |
| | The directory containing the build script. |
| | |
| | |
| | |
| | An |
13.3. The Script API
腳本執行的時候Gradle會把它編譯進實作了
Script
接口的一個類中,這樣接口中的屬性和方法都能直接使用了。
13.4. Declaring variables聲明變量
可是聲明兩種變量:局部變量和額外屬性。
13.4.1. Local variables局部變量
使用
def
關鍵字聲明局部變量,它們隻能在聲明域中通路。局部變量在Groovy中就有。
Example 13.2. Using local variables
build.gradle
def dest = "dest"
task copy(type: Copy) {
from "source"
into dest
}
13.4.2. Extra properties額外屬性
Gradle域模型中的增強對象都有額外的使用者定義屬性。這包括但不限于工程、任務、資源集等。通過ext屬性可以增加、讀取、改變額外屬性。也可以使用ext塊增加多個額外屬性。
Example 13.3. Using extra properties
build.gradle
apply plugin: "java"
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
sourceSets.all { ext.purpose = null }
sourceSets {
main {
purpose = "production"
}
test {
purpose = "test"
}
plugin {
purpose = "production"
}
}
task printProperties << {
println springVersion
println emailNotification
sourceSets.matching { it.purpose == "production" }.each { println it.name }
}
gradle -q printProperties
> gradle -q printProperties
3.1.0.RELEASE
[email protected]
main
plugin
上例中用
ext
塊增加了兩個額外屬性。另外通過設定ext.purpose為null為每個資源集增加了purpose屬性。一旦屬性被增加就可以像預定義屬性一樣通路。
通過要求嚴格文法,Gradle會在嘗試通路不存在是屬性命時立即失敗。額外屬性可以從任何域通路,父工程的額外屬性也能被子工程通路。
更多關于額外屬性通路:
ExtraPropertiesExtension
.
13.5. Some Groovy basics 基本Groovy入門
Groovy提供了大量特性來建立DSL,Gradle就利用了這一點。
13.5.1. Groovy JDK
Groovy給JVM類增加了大量好用的方法。比如
Iterable
有一個
each
方法,可以疊代通路元素:
Example 13.4. Groovy JDK methods
build.gradle
// Iterable gets an each() method
configurations.runtime.each { File f -> println f }
詳細請看
http://groovy.codehaus.org/groovy-jdk/13.5.2. Property accessors屬性通路符
Groovy會自動給屬性增加 getter或 setter 方法.
Example 13.5. Property accessors
build.gradle
// Using a getter method
println project.buildDir
println getProject().getBuildDir()
// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')
13.5.3. Optional parentheses on method calls括号可有可無
方法的括号在調用時不需要寫
Example 13.6. Method call without parentheses
build.gradle
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')
13.5.4. List and map literals疊代
Groovy提供了定義
List
和
Map的快捷方法:
Example 13.7. List and map literals
build.gradle
// List literal
test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
List<String> list = new ArrayList<String>()
list.add('org/gradle/api/**')
list.add('org/gradle/internal/**')
test.includes = list
// Map literal
apply plugin: 'java'
Map<String, String> map = new HashMap<String, String>()
map.put('plugin', 'java')
apply(map)
13.5.5. Closures as the last parameter in a method閉包作末參數
Gradle DSL随處使用閉包,閉包的概念見
here。如果方法的最後一個參數是閉包,則可以把閉包後置 :
Example 13.8. Closure as method parameter
build.gradle
repositories {
println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })
13.5.6. Closure delegate閉包委托
每個閉包都有一個
delegate
對象,Groovy使用它來查找閉包的非局部變量和引用。Gradle以此來配置閉包,給閉包添加
delegate對象。
Example 13.9. Closure delegates
build.gradle
dependencies {
assert delegate == project.dependencies
compile('junit:junit:4.11')
delegate.compile('junit:junit:4.11')
}