使用 Project.file() 方法能够相对项目目录定位一个文件例 16.1. 定位文件build.gradle// 使用一个相对路径File configFile = file('src/config.xml')// 使用一个绝对路径configFile = file(configFile.absolutePath)// 使用一个项目路径的文件对象 configFile = file(new File('src/config.xml'))`file() 方法接收任何形式的对象参数.
大多数构建工作需要操作文件,Gradle 增加了一些API帮助您处理这些工作。
为了提高响应能力,Gradle 默认缓存了所有编译后的脚本. 包括所有的构建脚本,初始化脚本,还有其他脚本. Gradle 创建了一个 .gradle 目录来存放编译后的脚本,下次您运行构建脚本时,如果这个脚本自从它被编译后就再也没有被改动过,Gradle 会先使用编译后的脚本. 否则 Gradle 会重新编译脚本,然后将新编译后的文件缓存起来.
Gradle 提供了多种的方法让您可以在构建脚本中添加属性. 使用 -D 命令选项,您可以向运行 Gradle 的 JVM 传递一个 system 属性 . Gradle 命令的 -D 选项 和 Java 命令的 -D 选项有些相同的效果.您也可以使用属性文件向您的 Project 对象中添加属性. 您可以在 Gradle 用户目录( 如果您没有在 USER_HOME/.gradle 配置默认设置,则由"GRADLE_USER_HOME"
下面补充的部分原本是第 14 章,最新的 Gradle 文档将其移除,所以将其作为补充放到这一章节。
终止任务是一个正在开发的功能.这里的终止任务并不是指终止一个任务, 而是指一个无论运行结果如何最后都会被执行的任务.例子 15.27. 加入一个任务终止器build.gradletask taskX << { println 'taskX'}task taskY << { println 'taskY'}taskX.finalizedBy taskYgradle -q taskX 的输出>
有时候也想要一个任务的行为是基于已经定义好的取值范围或者特定规则, 下面的例子就提供了一种很直观漂亮的方式:例子 15.25. 任务规则build.gradletasks.addRule("Pattern: ping<ID>") { String taskName -> if (taskName.startsWith("ping")) { task(taskName) <<
Gradle 提供了好几种跳过一个任务的方式.1. 使用判断条件 (predicate)你可以使用 onlyIf() 方法来为一个任务加入判断条件. 就和 Java 里的 if 语句一样, 任务只有在条件判断为真时才会执行. 你通过一个闭包来实现判断条件. 闭包像变量一样传递任务, 如果任务应该被执行则返回真, 反之亦然. 判断条件在任务执行之前进行判断.例子 15.20. 使用判断条件跳过一个任务build.
有时候你想要替换一个任务. 举个例子, 如果你想要互换一个通过 java 插件定义的任务和一个自定义的不同类型的任务:例子 14.19. 覆写一个任务build.gradletask copy(type: Copy)task copy(overwrite: true) << { println('I am the new one.')}gradle -q copy 的输出> gradle -q copyI am the new one.
任务的排序功能正在测试和优化. 请注意, 这项功能在 Gradle 之后的版本里可能会改变.在某些情况下, 我们希望能控制任务的的执行顺序, 这种控制并不是向上一张那样去显示地加入依赖关系. 最主要的区别是我们设定的排序规则不会影响那些要被执行的任务, 只是影响执行的顺序本身. 好吧, 我知道可能有点抽象.我们来看看以下几种有用的场景:执行连续的任务: eg.
举一个例子, 让我们看一看 Gradle 自带的 Copy task. 为了创建一个 Copy task, 你需要在你的构建脚本里先声明它:例子 15.7. 创建一个 copy taskbuild.gradletask myCopy(type: Copy)它创建了一个没有默认行为的 copy task. 这个 task 可以通过它的 API 来配置(参考 Copy). 接下来例子展示了不同的实现方法.
你经常需要在构建文件里找到你定义的 tasks,举个例子,为了配置它们或者使用它们作为依赖. 有许多种方式都可以来实现定位.首先,每一个任务都必须是一个 project 的有效属性,并使用任务名来作为属性名:例子 15.4. 通过属性获取 tasksbuild.gradletask helloprintln hello.nameprintln project.hello.nameTasks 也可以通过 tasks collection 来得到.例子 15.5.
我们已经在第 6 章学习了定义任务的形式 (keyword 形式). 当然也会有一些定义形式的变化来适应某些特殊的情况. 比如下面的例子中任务名被括号括起来了. 这是因为之前定义简单任务的形式 (keyword 形式) 在表达式里是不起作用的.例子 15.1. 定义 tasksbuild.gradletask(hello) <<
在调用方法时,圆括号可有可无,是个可选的.例子: 13.6.不使用圆括号调用方法build.gradletest.systemProperty 'some.prop', 'value'test.systemProperty('some.prop', 'value')
Groovy 自动将一个属性的引用转换为相应的 getter 或 setter 方法.例子: 13.5. 属性存取器// 使用 getter 方法println project.buildDirprintln getProject().getBuildDir()// 使用 setter 方法project.buildDir = 'target'getProject().setBuildDir('target')
Groovy 在 Java 基础上添加了很多有用的方法. 例如,Iterable 有一个 each 方法, 通过使用 each 方法,我们可以迭代出 Iterable 中的每一个元素:例子: 13.4.Groovy JDK 方法build.gradleconfiguration.runtime.each { File f -> println f }更多内容请阅读 http://groovy.codehaus.org/groovy-jdk/
Groovy 提供了大量的特性用来创建 DSL. Gradle 构建语言知道 Groovy 语言的工作原理,并利用这些特性帮助您编写构建脚本,特别是您在编写 plugin 或者 task 的时候,你会觉得很方便.
在 Gradle 领域模型中所有被增强的对象能够拥有自己定义的属性. 这包括,但不仅限于 projects , tasks , 还有 source sets . Project 对象可以添加,读取,更改扩展的属性. 另外,使用 ext 扩展块可以一次添加多个属性.例子 13.3. 使用扩展属性build.gradleapply plugin: "java"ext { springVersion = "3.1.0.RELEASE" emailNotification = "build@master.
局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性.例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }
在 Gradle 构建脚本中有两种类型的变量可以声明:局部变量 ( local ) 和 扩展属性 ( extra ) .
关注时代Java