课程表

Gradle课程

工具箱
速查手册

Gradle 编写构建脚本

当前位置:免费教程 » 软件/图像 » Gradle

这一章着眼于一些编写构建脚本的详细信息。

Gradle 构建语言

Gradle 提供一种领域特定语言或者说是 DSL,来描述构建。这种构建语言基于 Groovy 中,并进行了一些补充,使其易于描述构建。

Project API

Java 构建入门的教程中,我们使用了 apply ()方法。这方法从何而来?我们之前说在 Gradle 中构建脚本定义了一个项目(project)。在构建的每一个项目中,Gradle 创建了一个 Project 类型的实例,并在构建脚本中关联此 Project 对象。当构建脚本执行时,它会配置此 Project 对象:

  • 在构建脚本中,你所调用的任何一个方法,如果在构建脚本中未定义,它将被委托给 Project 对象。
  • 在构建脚本中,你所访问的任何一个属性,如果在构建脚本里未定义,它也会被委托给 Project 对象。

下面我们来试试这个,试试访问 Project 对象的 name 属性。

访问 Project 对象的属性

build.gradle

  1. println name
  2. println project.name

gradle -q check 的输出结果

  1. > gradle -q check
  2. projectApi
  3. projectApi

这两个 println 语句打印出相同的属性。在生成脚本中未定义的属性,第一次使用时自动委托到 Project 对象。其他语句使用了在任何构建脚本中可以访问的 project 属性,则返回关联的 Project 对象。只有当您定义的属性或方法 Project 对象的一个成员相同名字时,你才需要使用 project 属性。

标准 project 属性

Project对象提供了一些在构建脚本中可用的标准的属性。下表列出了常用的几个属性。

表 13.1. Project 属性

名称 类型 默认值
project Project Project实例
name String 项目目录的名称。
path String 项目的绝对路径。
description String 项目的描述。
projectDir File 包含生成脚本的目录。
buildDir File projectDir/build
group Object 未指定
version Object 未指定
ant AntBuilder AntBuilder实例

Script API

当 Gradle 执行一个脚本时,它将脚本编译为一个实现了 Script 接口的类。这意味着所有由该Script 接口声明的属性和方法在您的脚本中是可用的。

声明变量

有两类可以在生成脚本中声明的变量: 局部变量和额外属性。

局部变量局部

局部变量是用 def 关键字声明的。它们只在定义它们的范围内可以被访问。局部变量是 Groovy 语言底层的一个特征。

示例 13.2. 使用局部变量

build.gradle

  1. def dest = "dest"
  2. task copy(type: Copy) {
  3. from "source"
  4. into dest
  5. }

额外属性

Gradle 的域模型中,所有增强的对象都可以容纳用户定义的额外的属性。这包括但并不限于项目(project)、任务(task)和源码集(source set)。额外的属性可以通过所属对象的 ext 属性进行添加,读取和设置。或者,可以使用 ext 块同时添加多个属性。

13.3 例子. 使用额外属性

build.gradle

  1. apply plugin: "java"
  2. ext {
  3. springVersion = "3.1.0.RELEASE"
  4. emailNotification = "build@master.org"
  5. }
  6. sourceSets.all { ext.purpose = null }
  7. sourceSets {
  8. main {
  9. purpose = "production"
  10. }
  11. test {
  12. purpose = "test"
  13. }
  14. plugin {
  15. purpose = "production"
  16. }
  17. }
  18. task printProperties << {
  19. println springVersion
  20. println emailNotification
  21. sourceSets.matching { it.purpose == "production" }.each { println it.name }
  22. }

gradle -q printProperties的输出结果

  1. > gradle -q printProperties
  2. 3.1.0.RELEASE
  3. build@master.org
  4. main
  5. plugin

在此示例中, 一个 ext 代码块将两个额外属性添加到 project 对象中。此外,通过将ext.purpose 设置为 null(null是一个允许的值),一个名为 purpose 的属性被添加到每个源码集(source set)。一旦属性被添加,他们就可以像预定的属性一样被读取和设置。

通过添加属性所要求特殊的语法,Gradle 可以在你试图设置 (预定义的或额外的) 的属性,但该属性拼写错误或不存在时 fail fast。[5]额外属性在任何能够访问它们所属的对象的地方都可以被访问,这使它们有着比局部变量更广泛的作用域。父项目上的额外属性,在子项目中也可以访问。

有关额外属性和它们的 API 的详细信息,请参阅 ExtraPropertiesExtension。

一些 Groovy 的基础知识

Groovy 提供了用于创建 DSL 的大量特点,并且 Gradle 构建语言利用了这些特点。了解构建语言是如何工作的,将有助于你编写构建脚本,特别是当你开始写自定义插件和任务的时候。

Groovy JDK

Groovy 对 JVM 的类增加了很多有用的方法。例如, iterable 新增的 each 方法,会对iterable 的元素进行遍历:

Groovy JDK 的方法

build.gradle

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

可以看看http://groovy.codehaus.org/groovy-jdk/,了解更多详细信息。

属性访问器

Groovy 会自动地把一个属性的引用转换为对适当的 getter 或 setter 方法的调用。

属性访问器

build.gradle

  1. // Using a getter method
  2. println project.buildDir
  3. println getProject().getBuildDir()
  4. // Using a setter method
  5. project.buildDir = 'target'
  6. getProject().setBuildDir('target')

括号可选的方法调用

调用方法时括号是可选的。

不带括号的方法调用

build.gradle

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

List 和 Map

Groovy 提供了一些定义 List 和 Map 实例的快捷写法。

List and map

build.gradle

  1. // List literal
  2. test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
  3. List<String> list = new ArrayList<String>()
  4. list.add('org/gradle/api/**')
  5. list.add('org/gradle/internal/**')
  6. test.includes = list
  7. // Map literal
  8. apply plugin: 'java'
  9. Map<String, String> map = new HashMap<String, String>()
  10. map.put('plugin', 'java')
  11. apply(map)

作为方法最后一个参数的闭包

Gradle DSL 在很多地方使用闭包。你可以在这里查看更多有关闭包的资料。当方法的最后一个参数是一个闭包时,你可以把闭包放在方法调用之后:

作为方法参数的闭包

build.gradle

  1. repositories {
  2. println "in a closure"
  3. }
  4. repositories() { println "in a closure" }
  5. repositories({ println "in a closure" })

闭包委托(delegate)

每个闭包都有一个委托对象,Groovy 使用它来查找变量和方法的引用,而不是作为闭包的局部变量或参数。Gradle 在配置闭包中使用到它,把委托对象设置为被配置的对象。

闭包委托

build.gradle

  1. dependencies {
  2. assert delegate == project.dependencies
  3. compile('junit:junit:4.11')
  4. delegate.compile('junit:junit:4.11')
  5. }
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号