gradle - 扩展属性如何像同时采用闭包和对象的方法一样起作用

标签 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 

实际上会导致错误,因为 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/

相关文章:

windows - 在 Windows 10 上全新安装 intellij idea 2020.1.2 社区版后未找到 gradle-wrapper.properties

android - Android:build.gradle中的重复条目

android - gradle 执行过程错误流

groovy - 在另一个 groovy 中包含一个 groovy 脚本

groovy - 如何仅将非空项目添加到 Groovy 中的列表

android - 尝试为 Android 应用程序导出签名包时出现错误 "setTestClassesDir(File) method has been deprecated"

android - 无法使用 Gradle 包含来自另一个 Android 库的 Android 库依赖项

grails - 连接到 Active Directory 并搜索用户

grails - 如何检查params中是否存在参数?

image - 如何使用 Grails 使用 imgscalr