理解 gradle 语法

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 语法)