gradle技巧之语法浅谈
- 原文链接 : Gradle tip #2: understanding syntax
- 原文作者 : Pavlo Dudka
- 译文出自 : 开发技术前线 www.devtf.cn
- 译者 : FTExplore
- 状态 : 未完成 / 校对中 / 完成
回顾
在上一篇的博文(Gradle tip #2 : Tasks)中,我们讨论了gradle构建的基本单位Task. 并且介绍了构建过程的各个阶段及其生命周期.而本文会重点介绍gradle的语法.只有具备了gradle
的相关语法知识,才会大幅度的提高对于阅读、学习或者编写gradle脚本的效率,正所谓”磨刀不误砍柴工”是也.
引言
gradle 是groovy语言实现的构建工具. groovy是运行在jvm平台的一门敏捷开发语言.其语法和java有诸多类似之处,然而其具备一些java没有的概念需要读者细细体会.下面会详细的介绍
groovy的基本语法,当然如果您已经对groovy的语法有了一定的了解.可以直接跳过这一小节.
1、闭包的基本语法
闭包是groovy中最重要的概念之一. 简单地说闭包(Closures)是一段代码块. 这个代码块可以接受参数并具有返回值. 有一点要非常注意的是, 闭包往往不是在需要使用的时候才写出来
这么一段代码(就像Java的匿名类那样), 通过def 关键字可以声明一个变量代表一个闭包,然后在需要的时候直接使用该变量即可,多说无益,请看如下的例子:
一个简单的hello world闭包:
def myClosure = { println 'Hello world!' } //execute our closure myClosure()
output: Hello world!
如下是一个接受参数的闭包的例子:
def myClosure = {String str -> println str } //execute our closure myClosure('Hello world!')
output: Hello world!
如果闭包只接受一个参数,这个参数在代码块中可以用it代替:
def myClosure = {println it } //execute our closure myClosure('Hello world!')
output: Hello world!
如下是接受多个参数的闭包的例子:
def myClosure = {String str, int num -> println "$str : $num" } //execute our closure myClosure('my string', 21)
output: my string : 21
闭包里面的参数类型可以省略不写,例子如下:
def myClosure = {str, num -> println "$str : $num" } //execute our closure myClosure('my string', 21)
output: my string : 21
闭包还有一个比较酷的写法就是,可以直接调用context里面的变量,默认的context就是创建这个闭包的类(class) 例子如下:
def myVar = 'Hello World!' def myClosure = {println myVar} myClosure()
output: Hello world!
上面提到了闭包可以直接调用context的变量,这个context可以通过setDelegate()方法来改变,极大的增加了闭包的灵活性!
def myClosure = {println myVar} //I'm referencing myVar from MyClass class MyClass m = new MyClass() myClosure.setDelegate(m) myClosure() class MyClass { def myVar = 'Hello from MyClass!' }
output: Hello from MyClass!
2、闭包可以作为参数进行传递
在groovy中,将闭包作为参数传递进函数,是将逻辑进行分离解耦的重要手段.在上述的例子中,我们已经尝试了如何将闭包作为参数进行传递.下面我们总结一下传递闭包的方法:
1 接受一个参数的函数
myMethod(myClosure)
2 如果函数只接受一个参数,括号可以忽略
myMethod myClosure
3 可以将闭包以插入语的形式创建
myMethod {println ‘Hello World’}
4 函数接受两个参数
myMethod(arg1, myClosure)
5 接受两个参数,同样可以用插入语创建闭包
myMethod(arg1, { println ‘Hello World’ })
6 如果存在多个参数,且最后一个参数是闭包,闭包可以不写在括号内
myMethod(arg1) { println ‘Hello World’ }
细心的朋友们是不是觉得上述的六种用法中,第三条和第六条很眼熟?很像gradle中的scripts了?
Gradle
在知道了groovy的基本语法(尤其是闭包)之后,下面我们就以一个简单的gradle 脚本作为例子具体感受一下: