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对象作为参数