假设您的 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
实际上会导致错误,因为 ext 上不存在“类”。这可能是因为 ext 是一个带有动态添加的 ExtensionAware 接口(interface)的常规对象,该接口(interface)是由 extensions.create(...) 添加的。但这是一个牵强的、不太合理的猜测。
我不知道这些属性是如何设置的。该文档仅清楚地说明了如何使用属性扩展,而不是它们如何工作或它们是什么。谁能解释一下?
(1)当构建脚本中引用了'prop1'时,groovy如何知道去project.ext.prop1?
(2) 究竟什么是“分机”?
最佳答案
以下修改后的脚本应该可以让您理解:
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{ ... }
关于gradle - 扩展属性如何像同时采用闭包和对象的方法一样起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979053/