如何理解MavenPublication的语法

问题描述 投票:0回答:1

当我阅读文档时:https://docs.gradle.org/current/javadoc/org/gradle/api/publish/maven/MavenPublication.html。我看到内容爆炸了。

MavenPublication 是 Gradle 如何表示/配置 应该以 Maven 格式发布一些东西。你直接添加一个命名的 Maven通过发布项目的publishing.publications容器 提供 MavenPublication 作为类型。

 publishing {
   publications {
     myPublicationName(MavenPublication) {
       // Configure the publication here
     }
   }
 }

部分

 myPublicationName(MavenPublication) {
    // Configure the publication here
} 

语法非常混乱。 myPublicationName不像变量,也不像闭包,也不像方法,我应该在语法上理解什么。

java gradle groovy
1个回答
0
投票

该语法称为“领域特定语言 (DSL)”。具体来说,您引用的示例是 Groovy DSL。顾名思义,它是使用 Groovy 语言编写的 DSL。 知道 Gradle 的核心 API 是使用纯 Java 编写的,但实现了各种 Groovy 特定 API,例如

GroovyObjectSupport

Gradle 的现代版本提供了另一种 DSL:

Kotlin DSL

。顾名思义,它是使用 Kotlin 语言编写的 DSL。 您使用哪一个取决于您的偏好。但是,Gradle 的推荐和默认 DSL 是 Kotlin DSL:

https://blog.gradle.org/kotlin-dsl-is-now-the-default-for-new-gradle-builds

回到你的例子,

myPublicationName

在普通Java中是:

PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class);
publishing.getPublications().create("myPublicationName", MavenPublication.class, publication -> {})

在 Groovy 世界中,您可以省略 
get

部分,该部分随后将变为

publishing.publications
。 Gradle 在
PublishingExtension
类型上提供了一种便捷的方法:
void publications(Action<? super PublicationContainer> configure);

这允许:

publishing { publications { // the convenient method } }

然后您可以看到 
Action

中“this”的范围是

PublicationContainer
,然后您可以通过显式调用
create
方法(如上所示)或使用 Gradle 提供的 Groovy 特定习惯用法来创建发布,在这种情况下,调用不存在的方法会在幕后调用
create
,使用方法名称作为发布名称。
    

© www.soinside.com 2019 - 2024. All rights reserved.