Gradle 1.12 翻译——第十三章 编写构建脚本
有关其它已翻译的章节请关注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 上的文档为准。如有发现翻译有误的地方,将首先在以上两个地方更新。
因时间精力问题。博客中发表的译文基本不会同步改动。
第十三章 编写构建脚本
这一章着眼于一些编写构建脚本的具体信息。
13.1. Gradle
构建语言
Gradle 提供一种领域特定语言或者说是
DSL。来描写叙述构建。这样的构建语言基于 Groovy 中。并进行了一些补充。使其易于描写叙述构建。
13.2. Project
API
在第
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属性。
13.2.1. 标准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实例 |
13.3. Script
API
当 Gradle 运行一个脚本时,它将脚本编译为一个实现了Script接口的类。这意味着全部由该Script接口声明的属性和方法在您的脚本中是可用的。
13.4. 声明变量
有两类能够在生成脚本中声明的变量: 局部变量和额外属性。
13.4.1. 局部变量局部
局部变量是用defkeyword声明的。
它们仅仅在定义它们的范围内能够被訪问。局部变量是Groovy
语言底层的一个特征。
演示样例 13.2. 使用局部变量
build.gradle
def dest = "dest"
task copy(type: Copy) {
from "source"
into dest
}
13.4.2. 额外属性
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。
13.5.一些 Groovy
的基础知识
Groovy 提供了用于创建 DSL 的大量特点,而且 Gradle 构建语言利用了这些特点。了解构建语言是怎样工作的,将有助于你编写构建脚本,特别是当你開始写自己定义插件和任务的时候。
13.5.1. Groovy
JDK
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/,了解很多其它具体信息。
13.5.2. 属性訪问器
Groovy 会自己主动地把一个属性的引用转换为对适当的 getter 或 setter 方法的调用。
样例 13.5. 属性訪问器
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 括号可选的方法调用
调用方法时括号是可选的。
演示样例 13.6. 不带括号的方法调用
build.gradle
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')
13.5.4. List
和 Map
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)
13.5.5.作为方法最后一个參数的闭包
Gradle DSL 在非常多地方使用闭包。你能够在这里查看很多其它有关闭包的资料。
当方法的最后一个參数是一个闭包时。你能够把闭包放在方法调用之后:
Example 13.8. 作为方法參数的闭包
build.gradle
repositories {
println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })
13.5.6. 闭包托付(delegate)
每一个闭包都有一个托付对象。Groovy
使用它来查找变量和方法的引用。而不是作为闭包的局部变量或參数。
Gradle 在配置闭包中使用到它,把托付对象设置为被配置的对象。
Example 13.9. 闭包托付
build.gradle
dependencies {
assert delegate == project.dependencies
compile('junit:junit:4.11')
delegate.compile('junit:junit:4.11')
}
[5] 截至
Gradle 1.0-milestone-9版本号,我们鼓舞但不强制要求使用 ext 来加入额外属性因此,当未知的属性被设置时,Gradle不会构建失败。然而。它将打印一个警告。
Gradle 1.12 翻译——第十三章 编写构建脚本的更多相关文章
- Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12 翻译——第十五章. 任务详述
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12 翻译——第十八章. 日志
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12用户指南翻译——第二十三章. Java 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- Gradle 1.12 翻译——第九章 Groovy快速入门
由于时间关系,没办法同时做笔记和翻译,关于Gradle的用户指南,本博客不再做相关笔记,而只对未翻译章节进行翻译并在此发表. 有关其他已翻译的章节请关注Github上的项目:https://githu ...
- Gradle 1.12 翻译——第九章 Groovy高速入口
由于时间.没办法,做笔记和翻译的同时,大约Gradle用户指南.本博客不再做相关的注意事项.而仅仅翻译和本出版物中未翻译章节. 有关其他章节翻译请注意Github该项目:https://github. ...
- Gradle 1.12翻译——第二十章. 构建环境
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- 【转载】Gradle学习 第六章:构建脚本基础
转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...
随机推荐
- 阿里云 centos vim 显示中文 乱码
开始以为是vim 设置编码的问题 :网上搜 改 .vimrc 无效!!! 后转战 是不是系统里面没有中文字体 1.先从你本机 C:\Windows\Fonts 拷贝或者网络上下载你想要安装的 ...
- Python--模块微谈
一个.py文件是一个模块,模块里面可以定义很多函数,载入模块就可以使用函数.模块又有python内置模块,又有第三方模块,不同模块里可以有相同的函数名和变量名,模块又可以组织到package里,不同的 ...
- python自动开发之第十三天
1.Paramiko模块下的demo.py程序 前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...
- 【算法】简单选择排序 O(n^2) 不稳定的 C语言
简单选择排序 一.算法描述 假设序列中有N个元素: 第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换 第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换 第3趟找到第3到N个元素 ...
- linker command failed with exit code 1
这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...
- 转:PHP中实现非阻塞模式
原文来自于:http://blog.csdn.net/linvo/article/details/5466046 程序非阻塞模式,这里也可以理解成并发.而并发又暂且可以分为网络请求并发 和本地并发 . ...
- ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)
首先说软件: 要不是用SCVMM来转的话,我用得最爽的还是WINIMAGE,自然流畅.其它的都有各种问题. 其次说说配置更改: 如果原ESXI里只有一个硬盘,一切好说,如果里面挂载了两个,甚至三个硬盘 ...
- Lua参考手册
英文原版: http://www.lua.org/manual/5.1/ 中文版下面2个地址都有:一样的 manual.luaer.cn lua在线手册 lua参考手册Lua参考手册的中文翻译(云风翻 ...
- PKU 1064 Cable master
题目链接:点击打开链接 有n段绳子,给定n段绳子的长度,单位为厘米.求能够把这些绳子分成k段的最长的段的长度.题目中的trick是最小是1cm,长度不能小于1cm,因此要转换成int来解,然后二分可以 ...
- rsync使用说明
需求:把10.5.128.190数据同步到10.5.128.27 用客服端-服务器模式,需要从客户端发起 也就是从10.5.128.27发起 10.5.128.27 作为客户端 10.5.128.19 ...