Gradle构建脚本中仅含标识符的Groovy闭包是什么?
Gradle中
configurations { myConfig }的闭包生效逻辑 这个问题的核心是Groovy闭包的委托机制,以及Gradle对闭包的特殊处理:
- 普通Groovy闭包默认采用「所有者优先」的解析策略,所以你写
def myClosure = { foo }; myClosure()时,会在当前类的上下文里找foo属性或方法,找不到就抛出MissingPropertyException。 - 但Gradle在调用
configurations()方法时,会给传入的闭包做两个关键配置:- 把闭包的**委托对象(delegate)**设置为
ConfigurationContainer类型的实例; - 将闭包的解析策略改为委托优先(DELEGATE_FIRST),也就是优先去委托对象上查找标识符对应的内容。
- 把闭包的**委托对象(delegate)**设置为
那闭包里的myConfig到底是什么?这是Groovy的方法调用语法糖:当一个标识符单独出现时,Groovy会自动把它当作无参方法调用(即myConfig())。而ConfigurationContainer实现了NamedDomainObjectContainer接口,这个接口会动态处理这种命名方法调用——当你调用myConfig()时,实际上是触发了容器的create("myConfig")方法,创建一个名为myConfig的Configuration对象并添加到容器中。
你可以把这段代码改写成显式调用,效果完全一致:
configurations { create("myConfig") }
内容的提问来源于stack exchange,提问作者Sebastian Oberhoff
相关产品推荐
相关产品推荐

