扩展属性如何像处理闭包和对象的方法一样

时间:2017-07-07 20:21:47

标签: gradle groovy

假设你的build.gradle非常简单,比如

apply plugin: 'groovy'

ext.foo1 = 'bar1'
ext {
     foo2 = 'bar2'
}
assert foo1 == 'bar1'
assert foo2 == 'bar2'

这是合法的常规,但我不明白为什么。在ext的第二个引用中,ext被视为一个方法,它接受一个闭包,将其所有者设置为ext的实例。然而,在第一个引用中,它只是一个ExtraProperties实例。使用类似的东西:

println ext.class.name 

实际上会导致错误,因为" class"在ext上不存在。这可能是因为ext是一个带有动态添加的ExtensionAware接口的常规对象,它是由extensions.create(...)添加的。但这是一个牵强的,不太合理的猜测。

我不知道如何设置这些属性。文档只清楚如何使用属性扩展,而不是它们如何工作或它们是什么。谁能解释一下?

(1)当' prop1'时,groovy如何知道去project.ext.prop1?在构建脚本中引用? (2)什么是' ext',真的吗?

1 个答案:

答案 0 :(得分:0)

以下修改后的脚本应该让您理解:

apply plugin: 'groovy'

ext.foo1 = 'bar1'
ext {
    println "log1:: ${it.getClass()} ${System.identityHashCode(it)}"
    foo2 = 'bar2'
}

println "log2:: ${ext.getClass()} ${System.identityHashCode(ext)}"

assert foo1 == 'bar1'
assert foo2 == 'bar2'

输出:

log1:: class org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension 464908575
log2:: class org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension 464908575

表示ext{ ... }等于ext.with{ ... }