有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html
本文原创。转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/40976325
关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。如有发现翻译有误的地方,将首先在以上两个地方更新。
因时间精力问题。博客中发表的译文基本不会同步改动。
第十三章 编写构建脚本
这一章着眼于一些编写构建脚本的具体信息。
在第
7 章。 Java 高速入门的教程中,我们使用了 apply
()
方法。
这方法从何而来?我们之前说在 Gradle 中构建脚本定义了一个项目(project)。在构建的每个项目中,Gradle 创建了一个Project
类型的实例,并在构建脚本中关联此Project
对象。
当构建脚本运行时,它会配置此Project
对象:
获取有关编写构建脚本帮助
不要忘记您的构建脚本是简单的 Groovy 代码,并驱动着 Gradle API。而且Project
接口是您在
Gradle API 中訪问一切 的入点。所以。假设你想知道什么 '标签(tag)' 在构建脚本中可用,您能够去看项目
接口的文档。
-
在构建脚本中,你所调用的不论什么一个方法,假设在构建脚本中没有定义,它将被托付给
Project
对象。 -
在构建脚本中。你所訪问的不论什么一个属性。假设在构建脚本里没有定义。它也会被托付给
Project
对象。
以下我们来试试这个。试试訪问Project
对象的name
属性。
Example 13.1. 訪问 Project 对象的属性
build.gradle
println name println project.name
gradle
-q check
的输出结果
> gradle -q check projectApi projectApi
这两个println
语句打印出同样的属性。
在生成脚本中没有定义的属性,第一次使用时自己主动托付到Project
对象。其它语句使用了在不论什么构建脚本中能够訪问的project
属性,则返回关联的Project
对象。仅仅有当您定义的属性或方法Project
对象的一个成员同样名字时,你才须要使用project
属性。
Project
对象提供了一些在构建脚本中可用的标准的属性。
下表列出了经常使用的几个属性。
表 13.1. Project属性
名称 | 类型 | 默认值 |
project |
Project |
Project 实例 |
name |
String |
项目文件夹的名称。 |
path |
String |
项目的绝对路径。 |
description |
String |
项目的描写叙述。 |
projectDir |
File |
包括生成脚本的文件夹。 |
buildDir |
File |
|
group |
Object |
未指定 |
version |
Object |
未指定 |
ant |
AntBuilder |
AntBuilder 实例 |
当 Gradle 运行一个脚本时,它将脚本编译为一个实现了Script
接口的类。这意味着全部由该Script
接口声明的属性和方法在您的脚本中是可用的。
有两类能够在生成脚本中声明的变量: 局部变量和额外属性。
局部变量是用def
keyword声明的。
它们仅仅在定义它们的范围内能够被訪问。局部变量是Groovy 语言底层的一个特征。
Gradle 的域模型中,全部增强的对象都能够容纳用户定义的额外的属性。这包含但并不限于项目(project)、任务(task)和源代码集(source set)。
额外的属性能够通过所属对象的ext
属性进行加入,读取和设置。或者,能够使用ext
块同一时候加入多个属性。
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
的输出结果
> gradle -q printProperties 3.1.0.RELEASE build@master.org main plugin
在此演示样例中。 一个ext
代码块将两个额外属性加入到project
对象中。此外,通过将ext.purpose
设置为null
(null
是一个同意的值)。一个名为purpose
的属性被加入到每一个源代码集(source
set)。
一旦属性被加入,他们就能够像预定的属性一样被读取和设置。
通过加入属性所要求特殊的语法,Gradle 能够在你试图设置 (提前定义的或额外的) 的属性,但该属性拼写错误或不存在时 fail fast。[5]额外属性在不论什么能够訪问它们所属的对象的地方都能够被訪问。这使它们有着比局部变量更广泛的作用域。
父项目上的额外属性。在子项目中也能够訪问。
有关额外属性和它们的 API 的具体信息,请參阅ExtraPropertiesExtension
。
Groovy 提供了用于创建 DSL 的大量特点,而且 Gradle 构建语言利用了这些特点。了解构建语言是怎样工作的,将有助于你编写构建脚本,特别是当你開始写自己定义插件和任务的时候。
Groovy 对 JVM 的类添加了非常多实用的方法。比如, iterable
新增的each
方法,会对iterable
的元素进行遍历:
演示样例 13.4. Groovy JDK 的方法
build.gradle
// Iterable gets an each() method
configurations.runtime.each { File f -> println f }
能够看看http://groovy.codehaus.org/groovy-jdk/,了解很多其它具体信息。
Groovy 会自己主动地把一个属性的引用转换为对适当的 getter 或 setter 方法的调用。
调用方法时括号是可选的。
Groovy 提供了一些定义List
和Map
实例的快捷写法。
Example 13.7. 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)
Gradle DSL 在非常多地方使用闭包。你能够在这里查看很多其它有关闭包的资料。
当方法的最后一个參数是一个闭包时。你能够把闭包放在方法调用之后: