【问题标题】:What does it mean in Groovy to specify a property followed by a closure?在 Groovy 中指定一个属性后跟一个闭包是什么意思?
【发布时间】:2022-01-08 17:48:25
【问题描述】:

我对 Groovy 完全陌生,正在尝试学习它,但因为我无法很好地解析语法,甚至不知道在文档中的何处查找而受到阻碍。我在 Gradle 中使用 Groovy。很多地方都给出了例子,但没有解释它的含义,所以我只是需要一些指针。

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'com.xxx.yyy'
            artifactId = 'zzz'
            from components.java
        }
    }
    repositories {
        mavenLocal();
    }
}

主要的构建代码是指项目类上的东西。在那个类上,我可以找到一个名为 publishing 的属性,它是一个类 PublishingExtension。然后看起来大括号开始了一个带有代码的闭包。文档说这种语法:

publishing { }

配置PublishingExtension。我想了解的是当我指定什么看起来像一个属性并使用闭包跟随它时它的含义(即实际发生的事情)。在 Groovy 文档中,我找不到任何这样的语法,也找不到解释。我确定这很简单,但我什至不知道要寻找什么。

如果我访问Project Class API Docs,那里没有名为publishing 的方法。也没有由方法getPublishing 定义的属性。显然,publishing plugin 启用了这种神奇的功能。如果我访问Publishing Plugin API Doc,也没有关于此发布属性的描述或它如何修改基础项目。

同样,再深入一点,该闭包以符号 publications 开头,在 PublishingExtension 的文档中,我找到了一个类型为 PublicationContainer 的属性,它是只读的。我还找到了一个名为publications 的方法,它不接受闭包,而是Action<? super PublicationContainer> 类型的configuration。同样,我不知道花括号的内容如何转换为Action 类实例。这个对象是如何构造的? Action 是一个接口,唯一的方法是execute 但是完全不清楚这个动作是如何构造的。

定义动作的块以符号mavenJava 开头,看起来像一个方法,但实际上第一个符号是声明一个名为mavenJavaMavenPublication 类型的新对象的名称。要么这是神奇构造的(我不知道规则),要么有一个方法被调用,但是哪个方法? PublicationContainer 是什么让它知道任意mavenJava 命令应该创建一个对象实例。话又说回来,后面的花括号是闭包、配置还是更奇特的东西?

如您所见,我缺少一些关于 Groovy 工作原理的信息。到目前为止,我找不到解释这种语法的文档,但是如果我知道要查找什么,它可能就在那里。谁能解释一下语法的真正作用,或者让我去一个可以解释它的网站?

【问题讨论】:

标签: gradle groovy syntax


【解决方案1】:

调用publishing配置PublishingExtension

PublishingExtension 中,有一个publications 方法接受Action,这通常是从闭包强制执行的。在 Groovy 中,闭包会自动转换为具有单个方法的接口。

mavenJava是一个不存在的DSL方法,由Gradle DSL builder传递给PublicationContainercreate方法:

publishing.publications.create('mavenJava', MavenPublication) {
    // Configure the maven publication here
}

groupIdartifactIdMavenPublication 的属性,正在此处设置。

fromMavenPublicationfrom(component),使用 Groovy 简化的方法调用字面量编写,不带括号。

一般而言,Gradle 使用根 DSL 构建器,它调用插件提供的嵌套 DSL 构建器。因此,有时很难找到 build.gradle 文件所有部分的正确引用(对于 IDE 也是如此)。

【讨论】:

  • 闭包如何转化为Action?有规范的翻译吗?以大括号开头和结尾的所有内容都是闭包吗?是否有启发式方法来找出自动调用的各种可用方法中的哪些?例如,是否有始终可用的“创建”方法?在发布扩展上调用什么方法来配置它?
  • groovy-lang.org/… 关闭强制。看,你真的应该开始学习基础知识了。如果你是“全新的”,没有人能解释你什么
  • 是的,我认为你是对的。今天上课。感谢您的帮助。
猜你喜欢
  • 2018-04-26
  • 2019-06-12
  • 2018-09-24
  • 2021-07-27
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多