美文网首页
【读书笔记】【gradle】gradle的学习

【读书笔记】【gradle】gradle的学习

作者: gerg_peng | 来源:发表于2018-12-01 21:35 被阅读5次

    内容主要摘自: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 "str :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 移步至这里阅读。

    相关文章

      网友评论

          本文标题:【读书笔记】【gradle】gradle的学习

          本文链接:https://www.haomeiwen.com/subject/ynfuwttx.html