gradle入门资料
三:读懂gradle语法
Gradle是一种声明式的构建工具。在执行时分2个阶段:配置阶段,执行阶段。
在配置阶段,gradle会读取build.gradle的所有文件来配置project和task(譬如配置project和task的property,处理task之间的依赖)
对于每一个task,gradle会在Project中创建一个同名的Property,所以我们可以将该Task当作Property来访问。 譬如:
task showDescription2 << { println description } showDescription2.description = ‘this is task showDescription‘
就是这种情况。除此之外,gradle还会创建一个同名的方法,该方法接受一个闭包,我们可以使用该方法来配置task.譬如:
task showDescription3 << { println description } showDescription3 { description = ‘this is task showDescription‘ }
要读懂Gradle,我们首先要了解Groovy语言的2个概念:一个Groovy的Bean概念,一个Groovy闭包的delegate机制。
Groovy的Bean概念和Java的不同,它会为每一个字段自动生成getter和setter,并且我们可以像访问字段本身一样调用getter和setter.
class GroovyBeanExample { private String name } def bean = new GroovyBeanExample() bean.name = ‘this is name‘ println bean.name
我们并不是在直接访问name属性,当我们执行"bean.name = ‘this is name‘"时,我们实际调用的是"bean.setName(‘this is name‘)"。
另外,Gradle大量使用了Groovy闭包的delegate机制。简单的说,delegate机制可以将闭包中执行代码的作用对象设置成任意其它对象。譬如:
class Child { private string name //不加分号? } class Parent { Child child = new Child(); void configChild(Closure c) { c.delegate = child c.setResolveStrategy Closure.DELEGATE_FIRST c() } } def parent = new Parent() parent.configChild { name = "child name" } print parent.child.name
在调用parent.configChild时,先执行了void configChild(Closure c)中的代码,将该闭包中执行代码的作用对象设为child了,所以name = "child name"是child执行的。
与Groovy Bean一样,delegate机制的一个好处是可以增加所创建的DSL的可读性。
原文地址:http://6169621.blog.51cto.com/6159621/1564278