天天看點

翻譯:Gradle之建構腳本編寫

原文位址 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

project

Project

The 

Project

 instance

name

String

The name of the project directory.

path

String

The absolute path of the project.

description

String

A description for the project.

projectDir

File

The directory containing the build script.

buildDir

File

projectDir

/build

group

Object

unspecified

version

Object

unspecified

ant

AntBuilder

An 

AntBuilder

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')
}