Gradle 模块元数据是一种用于序列化 Gradle 组件模型的格式。它类似于 Apache Maven™ 的 POM 文件 或 Apache Ivy™ 的 ivy.xml 文件。元数据文件的目标是为 消费者 提供一个关于发布到存储库的内容的合理模型。
Gradle 模块元数据是一种独特的格式,旨在通过使其支持多平台和变体感知来改进依赖项解析。
特别是,Gradle 模块元数据支持
发布 Gradle 模块元数据将为您的消费者提供更好的依赖项管理
使用 Maven Publish 插件 或 Ivy Publish 插件 时,Gradle 模块元数据会自动发布。
Gradle 模块元数据的规范可以在 这里 找到。
与其他格式的映射
Gradle 模块元数据会自动发布到 Maven 或 Ivy 存储库。但是,它不会取代 pom.xml 或 ivy.xml 文件:它与这些文件一起发布。这样做是为了最大化与第三方构建工具的兼容性。
Gradle 尽力将 Gradle 特定的概念映射到 Maven 或 Ivy。当构建文件使用只能在 Gradle 模块元数据中表示的功能时,Gradle 会在发布时发出警告。下表总结了某些 Gradle 特定功能如何映射到 Maven 和 Ivy
Gradle | Maven | Ivy | 描述 |
---|---|---|---|
|
未发布 |
Gradle 依赖项约束是 传递的,而 Maven 的依赖项管理块 不是 |
|
发布 所需 版本 |
发布 所需 版本 |
||
未发布 |
未发布 |
组件功能是 Gradle 独有的 |
|
变体工件已上传,依赖项作为 可选 依赖项发布 |
变体工件已上传,依赖项未发布 |
功能变体是可选依赖项的良好替代品 |
|
工件已上传,依赖项是映射描述的那些 |
工件已上传,依赖项被忽略 |
自定义组件类型在任何情况下都可能无法从 Maven 或 Ivy 消费。它们通常存在于自定义生态系统的上下文中。 |
禁用元数据兼容性发布警告
如果您想抑制警告,可以使用以下 API 来实现
-
对于 Maven,请参阅 MavenPublication 中的
suppress*
方法 -
对于 Ivy,请参阅 IvyPublication 中的
suppress*
方法
publications {
register<MavenPublication>("maven") {
from(components["java"])
suppressPomMetadataWarningsFor("runtimeElements")
}
}
publications {
maven(MavenPublication) {
from components.java
suppressPomMetadataWarningsFor('runtimeElements')
}
}
与其他构建工具的交互
由于 Gradle 模块元数据并未广泛传播,并且旨在 最大化与其他工具的兼容性,Gradle 执行了一些操作
-
Gradle 模块元数据与给定存储库(Maven 或 Ivy)的常规描述符一起系统地发布
-
pom.xml
或ivy.xml
文件将包含一个 标记注释,它告诉 Gradle 该模块存在 Gradle 模块元数据
该标记的目标 不是 让其他工具解析模块元数据:它仅供 Gradle 用户使用。它向 Gradle 解释存在一个 更好 的模块元数据文件,并且应该使用它。这并不意味着从 Maven 或 Ivy 消费会中断,只是它在 降级模式 下工作。
这必须被视为一种 性能优化:Gradle 不会执行两次网络请求,一次获取 Gradle 模块元数据,然后一次在未命中的情况下获取 POM/Ivy 文件,而是首先查找最可能存在的文件,然后只有当模块确实已发布到 Gradle 模块元数据时才执行第二次请求。 |
如果您知道您所依赖的模块始终与 Gradle 模块元数据一起发布,您可以通过配置存储库的元数据源来优化网络调用
repositories {
maven {
url = uri("http://repo.mycompany.com/repo")
metadataSources {
gradleMetadata()
}
}
}
repositories {
maven {
url = "http://repo.mycompany.com/repo"
metadataSources {
gradleMetadata()
}
}
}
Gradle 模块元数据验证
Gradle 模块元数据在发布前经过验证。
强制执行以下规则
-
变体名称必须唯一,
-
每个变体必须至少有一个 属性,
-
两个变体不能具有 完全相同的属性和功能,
-
如果存在依赖项,则所有变体中至少有一个必须携带 版本信息。
这些规则确保了生成元数据的质量,并有助于确认消费不会出现问题。
Gradle 模块元数据可重现性
由于其实现方式,生成模块元数据文件的任务当前从未被 Gradle 标记为 UP-TO-DATE
。但是,如果构建输入和构建脚本都没有改变,则任务结果实际上是最新状态:它始终生成相同的输出。
如果用户希望每个构建调用都有一个唯一的 module
文件,则可以将生成元数据中的标识符链接到创建它的构建。用户可以选择在其 publication
中启用此唯一标识符
publishing {
publications {
create<MavenPublication>("myLibrary") {
from(components["java"])
withBuildIdentifier()
}
}
}
publishing {
publications {
myLibrary(MavenPublication) {
from components.java
withBuildIdentifier()
}
}
}
通过上述更改,生成的 Gradle 模块元数据文件将始终不同,从而强制下游任务将其视为过时。
禁用 Gradle 模块元数据发布
在某些情况下,您可能希望禁用 Gradle 模块元数据的发布
-
您正在上传的存储库拒绝元数据文件(未知格式)
-
您正在使用未正确映射到 Gradle 模块元数据的 Maven 或 Ivy 特定概念
在这种情况下,禁用 Gradle 模块元数据的发布只需禁用生成元数据文件的任务
tasks.withType<GenerateModuleMetadata> {
enabled = false
}
tasks.withType(GenerateModuleMetadata) {
enabled = false
}