理解 gradle 语法

作者: devYOUK | 来源:发表于2016-03-24 19:43 被阅读2008次

    1.初学者的问题...

    刚开始接触gradle的时候,会被它灵活的语法搞到头昏脑胀,要实现同一个配置,可以好几种写法,对初学者来说简直抓瞎。

    不过要是耐些性子,复制粘贴一下,还是可以搞一个可以运行的配置的,但要做点自定义行为,那就鞭长莫及了。

    这样的配置你可能见过不少:

        defaultConfig {
            applicationId "com.example.sample"
            minSdkVersion 8
            targetSdkVersion 19
        }
    

    有好奇心的同学可能会想,这个配置只能这么写吗?还有哪些可配置的属性?
    如果你好奇地想看下 gradle 文档,有可能你会更瞎。
    因为它还分为 dsl 文档跟 javadoc 文档!
    不过不管哪一个,一开始我都看不懂。

    2. 你需要一点点的Groovy知识

    gradle是基于Groovy语言的!要看懂它,自然需要知道一点Groovy。
    放心,真的是一点点而已。

    2.1 来定义一个简单的函数

    def sayHello (String name){
        println("Hello " + name)
    }
    

    看出来它是干嘛的么,估计都猜到了
    我们来调用一下

    sayHello("你大爷")
    
    //output
    Hello 你大爷
    

    熟悉的配方...一眼就看穿是干嘛的函数
    接下来就来点不一样的

    概念1:调用函数时,括号可以省略

    现在调用可以写成:

    def sayHello (String name){
        println "Hello " + name //这个println没有了括号!
    }
    
    // 执行
    sayHello "他大爷" // 这里也没有了括号
    

    2.2 来定义一个不简单的函数

    定义一个接收Closure参数的方法

    def saySomeThing (Closure config){
        println "some thing"
    }
    
    概念2:一对花括号 ' {} ' 其实是 Closure 对象的实例化

    那么这个方法的调用应该怎样写呢

        // 这样
        saySomeThing({})
        // 或者省略括号
        saySomeThing {}
    
        //output
        some thing
        some thing
    

    2.3 来一段稍微不简单的代码

    接下来这段代码有 Class 有 method,真的不简单了哟...

        class AttrHandler{
            def fun1(String value){
                println "fun1 receive value ->"+value
            }
            def fun2(String... values){
                println
                for(String value:values){
                    println "func2 receive value ->"+value
                }
            }
        }
        def behaveAction(Closure config){
            config.delegate = new AttrHandler()
            config()
        }
    
    概念3:Closure 对象可以被代理执行

    注意到代码里面的 config.delegate = new AttrHandler()语句了么,这句话表示Closure代理给了AttrHandler执行;现在 {} 里的方法调用,会尝试找 AttrHandler 的方法并传参执行

    上面一段代码的使用:

    // 切记 括号可以省略,{}是个Closure对象...
    behaveAction{
       fun1 "好吃的"
       fun2 "大碗菜","康师傅","哇哈哈","海底捞"
    }
    
    

    看到这里是不是有点似曾相识了?

    // 输出
    fun1 receive value ->好吃的
    
    fun2 receive value ->大碗菜
    fun2 receive value ->康师傅
    fun2 receive value ->哇哈哈
    fun2 receive value ->海底捞
    

    3. 一起来看懂 gradle 文档

    4. 总结

    通常我们看到的 gradle 文档配置的一个个"属性",其实都对应着一个方法名。
    如果"属性"后面接着一个花括号'{}',那么意味着这个方法接受一个Closure对象作为参数

    相关文章

      网友评论

      本文标题:理解 gradle 语法

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