假设你的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',真的吗?
答案 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{ ... }