繁体   English   中英

在 Groovy 中指定一个属性后跟一个闭包是什么意思?

[英]What does it mean in Groovy to specify a property followed by a closure?

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

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

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

publishing { }

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

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

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

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

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

调用发布来配置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 也是如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM