Groovy编写Gradle构建脚本的依赖配置语法问题咨询
Gradle Groovy DSL 相关问题解答
给出的Groovy示例代码如下:
dependencies { classpath 'com.android.tools.build:gradle:0.13.2' }
已知前提:classpath是可通过传入字符串参数调用的函数,以下逐一解答对应问题:
问题1:dependencies是否是project对象的成员方法?
是。
Gradle的Project类本身就定义了dependencies成员方法,这个方法的作用就是加载项目的依赖配置,方法本身支持接收一个闭包类型的参数,用来承载具体的依赖声明逻辑。
问题2:classpath是project的方法,还是dependencies对应作用域下的方法?
classpath属于dependencies方法执行时的作用域方法,不属于project对象。
当你调用dependencies方法传入闭包时,Gradle会自动把这个闭包的委托对象设置为DependencyHandler实例,同时调整闭包的方法解析优先级,让闭包里的方法调用优先命中委托对象的成员。classpath本身是Gradle预置的构建脚本依赖配置项,对应DependencyHandler下的方法,只有在dependencies的配置闭包内才能直接省略前缀调用,在project根作用域直接调classpath会报找不到方法的错误。
顺便提一句,你看到的classpath 'com.android.tools.build:gradle:0.13.2'也是Groovy的语法糖:方法调用时如果传入的参数是字面量,可以省略括号,本质等价于classpath('com.android.tools.build:gradle:0.13.2')。
问题3:向函数传入闭包的语法具备怎样的实际含义?
这是Groovy实现DSL的核心语法,实际含义分两层:
- 语法层面:Groovy有固定的语法规则——如果方法的最后一个形参是闭包类型,调用时可以把闭包写在方法的圆括号外面;如果这个方法只有闭包这一个参数,还可以直接省略掉圆括号。你看到的
dependencies { ... }没有任何特殊魔法,本质就是dependencies({ // 闭包逻辑 })的简写,就是给dependencies方法传了一个闭包当参数。 - 逻辑层面:闭包本身是一段可延迟执行的代码块,把它作为参数传给方法后,方法可以自己决定什么时候执行这段代码、执行时给这段代码绑定怎样的上下文(也就是前面说的delegate委托对象)。Gradle就是靠这个机制,给不同配置方法传入的闭包绑定不同的配置类实例作为上下文,让你写构建脚本的时候不用写一堆冗长的对象前缀,直接调用配置方法就行,最终实现类似配置关键字的简洁书写效果。
内容的提问来源于stack exchange,提问作者laplacedoge
相关产品推荐
相关产品推荐

