Gradle 提供一种领域特定语言或者说是 DSL,来描述构建。这种构建语言基于 Groovy .
在构建的每一个项目中,Gradle 创建了一个 Project 类型的实例,并在构建脚本中关联此 Project 对象。当构建脚本执行时,它会配置此 Project 对象:
- 在构建脚本中,你所调用的任何一个方法,如果在构建脚本中未定义,它将被委托给 Project 对象。
- 在构建脚本中,你所访问的任何一个属性,如果在构建脚本里未定义,它也会被委托给 Project 对象。
在生成脚本中未定义的属性,第一次使用时自动委托到 Project 对象。其他语句使用了在任何构建脚本中可以访问的 project 属性,则返回关联的 Project 对象。只有当定义的属性或方法 Project 对象的一个成员相同名字时,才需要使用 project 属性来表明使用的是project的属性。
标准 project 常用属性:
当 Gradle 执行一个脚本时,它将脚本编译为一个实现了 Script 接口的类。这意味着所有由该Script 接口声明的属性和方法在我们的脚本中都是可用的。
有两类可以在生成脚本中声明的变量: 局部变量和额外属性。
局部变量:是用 def 关键字声明的。它们只在定义它们的范围内可以被访问。局部变量是 Groovy 语言底层的一个特征。
额外属性:在Gradle 的域模型中,所有增强的对象都可以容纳用户定义的额外的属性。这包括但并不限于项目(project)、任务(task)和源码集(source set)。额外的属性可以通过所属对象的 ext 属性进行添加,读取和设置。或者,可以使用 ext 块同时添加多个属性。
额外属性在任何能够访问它们所属的对象的地方都可以被访问,这使它们有着比局部变量更广泛的作用域。父项目上的额外属性,在子项目中也可以访问。
Groovy 的基础知识
Groovy 会自动地把一个属性的引用转换为对适当的 getter 或 setter 方法的调用。
调用方法时括号是可选的:
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')
Gradle DSL 在很多地方使用闭包。当方法的最后一个参数是一个闭包时,你可以把闭包放在方法调用之后:
repositories {
println "in a closure"
}
repositories() { println "in a closure" }
repositories ({ println "in a closure" })
闭包委托?