内容主要摘自:http://blog.csdn.net/lzyzsd
1. gradle task
实例:
task myTask { def text = 'Hello, World!' //配置的时候执行 doLast { println text //task执行的时候,才会执行 } }
doLast的另外一种写法:
task myTask2 << { println "Hello, World!" }
执行这个task:
terminal输入命令:gradle mTask
输出: Hello, World!
2.简单的语法介绍
Gradle脚本是使用Groovy语言来写的,Groovy中有一个很重要的概念–Closure(闭包)。
- Closure简介
Closure是我们弄懂Gradle的关键。Closure是一段单独的代码块,它可以接收参数,返回值,也可以被赋值给变量。和Java中的Callable接口,Future类似,也像函数指针,你自己怎么方便理解都好。。。
例子:
`
//不接收参数
def myClosure = { println 'Hello world!' }
//execute our closuremy
Closure()
output: Hello world!
//接受一个参数
def myClosure = {String str -> println str}
//execute our closuremy
Closure('hello world')
output: Hello world!
//接收多个参数
def myClosure = {String str, int tag -> println "tag" }
//execute our closure
myClosure('hello world', 21)
output: my string : 21
//改变closure的上下文
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
`
正如你所看见的,在创建closure的时候,myVar并不存在。这并没有什么问题,因为当我们执行closure的时候,在closure的上下文中,myVar是存在的。这个例子中。因为我在执行closure之前改变了它的上下文为m,因此myVar是存在的。
把closure当做参数传递
closure的好处就是可以传递给不同的方法,这样可以帮助我们解耦执行逻辑。前面的例子中我已经展示了如何把closure传递给一个类的实例。下面我们将看一下各种接收closure作为参数的方法:
1.只接收一个参数,且参数是closure的方法: myMethod(myClosure)
2.如果方法只接收一个参数,括号可以省略: myMethod myClosure
3.可以使用内联的closure: myMethod {println ‘Hello World’}
4.接收两个参数的方法: myMethod(arg1, myClosure)
5.和4类似,单数closure是内联的: myMethod(arg1, { println ‘Hello World’ })
6.如果最后一个参数是closure,它可以从小括号从拿出来: myMethod(arg1) { println ‘Hello World’ }
这里我只想提醒你一下,3和6的写法是不是看起来很眼熟?
简单的gradle脚本分析
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } } allprojects { repositories { jcenter() } }
分析:buildscript方法,接受一个closure
def buildscript(Closure closure)
allprojects 同理。
下面的问题是buildscript 和 allprojects 方法是在哪里定义的?
答案就是project
在Project的文档页面搜索buildscript方法,会找到buildscript{} script block(脚本块).等等,script block是什么鬼?根据文档:
script block就是只接收closure作为参数的方法
继续阅读buildscript的文档,文档上说Delegates to: ScriptHandler from buildscript。也就是说,我们传递给buildscript方法的closure,最终执行的上下文是ScriptHandler。在上面的例子中,我们的传递给buildscript的closure调用了repositories(closure)和dependencies(closure)方法。既然closure被委托给了ScriptHandler,那么我们就去ScriptHandler中寻找dependencies方法。
找到了void dependencies(Closure configureClosure),根据文档,dependencies是用来配置脚本的依赖的。而dependencies最终又是委托到了DependencyHandler。
看到了Gradles是多么广泛的使用委托了吧。
gradle 文档及各插件的文档地址:https://docs.gradle.org/current/dsl/org.gradle.api.Project.html
task的执行顺序
这里主要有几个关键字:dependsOn,mustRunAfter,finalizedBy 移步至这里阅读。