在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 編寫構(gòu)建腳本
問題反饋
Gradle 插件
Scala 插件
Gradle 命令行的基本使用
任務(wù)詳述
安裝
概述
教程-雜七雜八
構(gòu)建環(huán)境
依賴管理基礎(chǔ)
使用 Gradle 圖形用戶界面
使用文件
CodeNarc 插件
Sonar 插件
Groovy 插件
Sonar Runner 插件
OSGi 插件
Ear 插件
Gradle 守護(hù)進(jìn)程
Java 插件
簡(jiǎn)介
構(gòu)建基礎(chǔ)
FindBugs 插件
Groovy 快速入門
JaCoCo 插件
PMD 插件
War 插件
Checkstyle 插件
日志
Java 構(gòu)建入門
Jetty 插件
從 Gradle 中調(diào)用 Ant
標(biāo)準(zhǔn)的 Gradle 插件
Web 工程構(gòu)建
JDepend 插件
編寫構(gòu)建腳本

編寫構(gòu)建腳本

這一章著眼于一些編寫構(gòu)建腳本的詳細(xì)信息。

Gradle 構(gòu)建語言

Gradle 提供一種領(lǐng)域特定語言或者說是 DSL,來描述構(gòu)建。這種構(gòu)建語言基于 Groovy 中,并進(jìn)行了一些補(bǔ)充,使其易于描述構(gòu)建。

Project API

Java 構(gòu)建入門的教程中,我們使用了 apply ()方法。這方法從何而來?我們之前說在 Gradle 中構(gòu)建腳本定義了一個(gè)項(xiàng)目(project)。在構(gòu)建的每一個(gè)項(xiàng)目中,Gradle 創(chuàng)建了一個(gè) Project 類型的實(shí)例,并在構(gòu)建腳本中關(guān)聯(lián)此 Project 對(duì)象。當(dāng)構(gòu)建腳本執(zhí)行時(shí),它會(huì)配置此 Project 對(duì)象:

  • 在構(gòu)建腳本中,你所調(diào)用的任何一個(gè)方法,如果在構(gòu)建腳本中未定義,它將被委托給 Project 對(duì)象。
  • 在構(gòu)建腳本中,你所訪問的任何一個(gè)屬性,如果在構(gòu)建腳本里未定義,它也會(huì)被委托給 Project 對(duì)象。

下面我們來試試這個(gè),試試訪問 Project 對(duì)象的 name 屬性。

訪問 Project 對(duì)象的屬性

build.gradle

println name
println project.name  

gradle -q check 的輸出結(jié)果

> gradle -q check
projectApi
projectApi  

這兩個(gè) println 語句打印出相同的屬性。在生成腳本中未定義的屬性,第一次使用時(shí)自動(dòng)委托到 Project 對(duì)象。其他語句使用了在任何構(gòu)建腳本中可以訪問的 project 屬性,則返回關(guān)聯(lián)的 Project 對(duì)象。只有當(dāng)您定義的屬性或方法 Project 對(duì)象的一個(gè)成員相同名字時(shí),你才需要使用 project 屬性。

標(biāo)準(zhǔn) project 屬性

Project對(duì)象提供了一些在構(gòu)建腳本中可用的標(biāo)準(zhǔn)的屬性。下表列出了常用的幾個(gè)屬性。

表 13.1. Project 屬性

名稱 類型 默認(rèn)值
project Project Project實(shí)例
name String 項(xiàng)目目錄的名稱。
path String 項(xiàng)目的絕對(duì)路徑。
description String 項(xiàng)目的描述。
projectDir File 包含生成腳本的目錄。
buildDir File projectDir/build
group Object 未指定
version Object 未指定
ant AntBuilder AntBuilder實(shí)例

Script API

當(dāng) Gradle 執(zhí)行一個(gè)腳本時(shí),它將腳本編譯為一個(gè)實(shí)現(xiàn)了 Script 接口的類。這意味著所有由該Script 接口聲明的屬性和方法在您的腳本中是可用的。

聲明變量

有兩類可以在生成腳本中聲明的變量: 局部變量和額外屬性。

局部變量局部

局部變量是用 def 關(guān)鍵字聲明的。它們只在定義它們的范圍內(nèi)可以被訪問。局部變量是 Groovy 語言底層的一個(gè)特征。

示例 13.2. 使用局部變量

build.gradle

def dest = "dest"
task copy(type: Copy) {
    from "source"
    into dest
}  

額外屬性

Gradle 的域模型中,所有增強(qiáng)的對(duì)象都可以容納用戶定義的額外的屬性。這包括但并不限于項(xiàng)目(project)、任務(wù)(task)和源碼集(source set)。額外的屬性可以通過所屬對(duì)象的 ext 屬性進(jìn)行添加,讀取和設(shè)置?;蛘撸梢允褂?ext 塊同時(shí)添加多個(gè)屬性。

13.3 例子. 使用額外屬性

build.gradle

apply plugin: "java"
ext {
    springVersion = "3.1.0.RELEASE"
    emailNotification = "build@master.org"
}
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的輸出結(jié)果

> gradle -q printProperties
3.1.0.RELEASE
build@master.org
main
plugin  

在此示例中, 一個(gè) ext 代碼塊將兩個(gè)額外屬性添加到 project 對(duì)象中。此外,通過將ext.purpose 設(shè)置為 null(null是一個(gè)允許的值),一個(gè)名為 purpose 的屬性被添加到每個(gè)源碼集(source set)。一旦屬性被添加,他們就可以像預(yù)定的屬性一樣被讀取和設(shè)置。

通過添加屬性所要求特殊的語法,Gradle 可以在你試圖設(shè)置 (預(yù)定義的或額外的) 的屬性,但該屬性拼寫錯(cuò)誤或不存在時(shí) fail fast。[5]額外屬性在任何能夠訪問它們所屬的對(duì)象的地方都可以被訪問,這使它們有著比局部變量更廣泛的作用域。父項(xiàng)目上的額外屬性,在子項(xiàng)目中也可以訪問。

有關(guān)額外屬性和它們的 API 的詳細(xì)信息,請(qǐng)參閱 ExtraPropertiesExtension。

一些 Groovy 的基礎(chǔ)知識(shí)

Groovy 提供了用于創(chuàng)建 DSL 的大量特點(diǎn),并且 Gradle 構(gòu)建語言利用了這些特點(diǎn)。了解構(gòu)建語言是如何工作的,將有助于你編寫構(gòu)建腳本,特別是當(dāng)你開始寫自定義插件和任務(wù)的時(shí)候。

Groovy JDK

Groovy 對(duì) JVM 的類增加了很多有用的方法。例如, iterable 新增的 each 方法,會(huì)對(duì)iterable 的元素進(jìn)行遍歷:

Groovy JDK 的方法

build.gradle

// Iterable gets an each() method
configurations.runtime.each { File f -> println f }  

可以看看http://groovy.codehaus.org/groovy-jdk/,了解更多詳細(xì)信息。

屬性訪問器

Groovy 會(huì)自動(dòng)地把一個(gè)屬性的引用轉(zhuǎn)換為對(duì)適當(dāng)?shù)?getter 或 setter 方法的調(diào)用。

屬性訪問器

build.gradle

// Using a getter method
println project.buildDir
println getProject().getBuildDir()
// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')   

括號(hào)可選的方法調(diào)用

調(diào)用方法時(shí)括號(hào)是可選的。

不帶括號(hào)的方法調(diào)用

build.gradle

test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')  

List 和 Map

Groovy 提供了一些定義 List 和 Map 實(shí)例的快捷寫法。

List and map

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)  

作為方法最后一個(gè)參數(shù)的閉包

Gradle DSL 在很多地方使用閉包。你可以在這里查看更多有關(guān)閉包的資料。當(dāng)方法的最后一個(gè)參數(shù)是一個(gè)閉包時(shí),你可以把閉包放在方法調(diào)用之后:

作為方法參數(shù)的閉包

build.gradle

repositories {
    println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })   

閉包委托(delegate)

每個(gè)閉包都有一個(gè)委托對(duì)象,Groovy 使用它來查找變量和方法的引用,而不是作為閉包的局部變量或參數(shù)。Gradle 在配置閉包中使用到它,把委托對(duì)象設(shè)置為被配置的對(duì)象。

閉包委托

build.gradle

dependencies {
    assert delegate == project.dependencies
    compile('junit:junit:4.11')
    delegate.compile('junit:junit:4.11')
}