【发布时间】: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 开头,看起来像一个方法,但实际上第一个符号是声明一个名为mavenJava 的MavenPublication 类型的新对象的名称。要么这是神奇构造的(我不知道规则),要么有一个方法被调用,但是哪个方法? PublicationContainer 是什么让它知道任意mavenJava 命令应该创建一个对象实例。话又说回来,后面的花括号是闭包、配置还是更奇特的东西?
如您所见,我缺少一些关于 Groovy 工作原理的信息。到目前为止,我找不到解释这种语法的文档,但是如果我知道要查找什么,它可能就在那里。谁能解释一下语法的真正作用,或者让我去一个可以解释它的网站?
【问题讨论】: