簡體   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