task hello << {
println "hello world"
}这和前者是有区别的,“<<”意思是给hello这个task添加一些action,其实就是调用了task的doLast方法,所以,它和以下代码时等价的:task hello {
doLast{
println "hello world"
}
}
关于haha 和 hello的区别,你还可以这样加深影响:
首先,进入到你的工程目录,执行gradle (后面没有任何参数,另外,这个时候,build.gradle中同时有hello 和 haha 两个tasks),结果如下:
E:\android\androidwork2.0\GradleTest>gradle haha Incremental java compilation is an incubating feature. :help Welcome to Gradle 2.13. To run a build, run gradle <task> ... To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle --help To see more detail about a task, run gradle help --task <task> BUILD SUCCESSFUL Total time: 21.877 secs E:\android\androidwork2.0\GradleTest>gradle tasks
可以按到haha,被打印了,而hello没有被打印,注意,这个时候默认执行的task 是help,也就是说并没有执行haha 这个task,可它还是被打印了,就说明使用定义haha 这种方式定义的task在初始化阶段就会被执行,而使用定义hello这种方法定义的task在执行阶段才会被执行。
在android studio的顶层build.gradle中有这样一个task:
task clean(type: Delete) { delete rootProject.buildDir }可以看到这个task有一个类型type,task有很多种类型的,以下列出来一些:这里用到了delete类型,task的类型可以这样理解吧:task中文就是任务,任务有很多种类,Delete就是说这是个删除文件的任务。![]()
这里就不更深入的探讨task了,这些类容已经可以使我们可以理解android studio中遇到的内容了。
另外一个很酷的点是closure的上下文是可以改变的,通过Closure#setDelegate()。这个特性非常有用:
def myClosure = {println myVar} //Im referencing myVar from MyClass class MyClass hello = new MyClass() myClosure.setDelegate(hello) myClosure() class MyClass { def myVar = Hello from MyClass! } #output: Hello from MyClass!如上所示,创建closure的时候,myVar并不存在。但是没关系,因为当执行closure的时候,在closure的上下文中,myVar是存在的。这个例子中。因为在执行closure之前改变了它的上下文为hello,因此myVar是存在的。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-25073-2.html
华谊你少赚了吗