绝大多数软件项目都旨在以某种方式使用某种东西. 它可以是其他软件项目使用的库,也可以是最终用户的应用程序. 发布是将构建的东西提供给消费者的过程.

在Gradle中,该过程如下所示:

  1. 定义什么发布

  2. 定义其发布到的位置

  3. 出版

这些步骤中的每一个都取决于要将工件发布到的存储库的类型. 两种最常见的类型是Maven兼容和Ivy兼容存储库,或者简称为Maven和Ivy存储库.

从Gradle 6.0开始, Gradle模块元数据将始终与Ivy XML或Maven POM元数据文件一起发布.

寻找有关上载任务和archives配置的信息? 请参阅" 旧版发布"一章,该功能现已弃用,并计划将其删除.

Gradle通过以Maven Publish插件Ivy Publish插件的形式提供一些预打包的基础结构,使发布到这些类型的存储库变得容易. 这些插件使您可以配置要发布的内容并以最小的努力执行发布.

publishing process
图1.发布过程

让我们更详细地看看这些步骤:

What to publish

Gradle需要知道要发布哪些文件和信息,以便消费者可以使用您的项目. 这通常是Gradle称为出版物工件和元数据的组合. 出版物所包含的内容取决于要发布到的存储库的类型.

例如,发往Maven存储库的出版物包括:

  • 一个或多个工件(通常由项目构建)

  • Gradle Module元数据文件,将描述已发布组件的变体,

  • Maven POM文件将标识主要工件及其依赖项. 主要工件通常是项目的生产JAR,辅助工件可能由" -sources"和" -javadoc" JAR组成.

此外,Gradle将发布上述所有内容的校验和,并配置为发布签名 . 从Gradle 6.0开始,这包括SHA256SHA512校验和.

Where to publish

Gradle需要知道在哪里发布工件,以便消费者可以掌握它们. 这是通过存储库完成的,该存储存储并提供了各种工件. Gradle还需要与存储库进行交互,这就是为什么您必须提供存储库的类型及其位置的原因.

How to publish

Gradle会自动为发布和存储库的所有可能组合生成发布任务,从而使您可以将任何工件发布到任何存储库. 如果要发布到Maven存储库,则任务的类型为PublishToMavenRepository ,而对于Ivy存储库,任务的类型为PublishToIvyRepository .

下面是一个实际的示例,演示了整个发布过程.

Setting up basic publishing

无论您的项目类型如何,发布的第一步都是应用适当的发布插件. 如简介中所述,Gradle通过以下插件支持Maven和Ivy存储库:

它们提供了配置相应存储库类型的发布所需的特定发布和存储库类. 由于Maven存储库是最常用的存储库,因此它们将成为本示例和本章其他示例的基础. 不用担心,我们将解释如何为Ivy存储库调整单个样本.

假设我们正在使用一个简单的Java库项目,因此仅应用以下插件:

例子1.应用必要的插件
build.gradle
plugins {
    id 'java-library'
    id 'maven-publish'
}
build.gradle.kts
plugins {
    `java-library`
    `maven-publish`
}

一旦应用了适当的插件,就可以配置发布和存储库. 对于此示例,我们想将项目的生产JAR文件(由jar任务生成的文件)发布到自定义的Maven存储库. 我们使用下面的Publishing publishing {}块来完成此操作,该块由PublishingExtension支持:

例子2.配置一个用于发布的Java库
build.gradle
group = 'org.example'
version = '1.0'

publishing {
    publications {
        myLibrary(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            name = 'myRepo'
            url = "file://${buildDir}/repo"
        }
    }
}
build.gradle.kts
group = "org.example"
version = "1.0"

publishing {
    publications {
        create<MavenPublication>("myLibrary") {
            from(components["java"])
        }
    }

    repositories {
        maven {
            name = "myRepo"
            url = uri("file://${buildDir}/repo")
        }
    }
}

This defines a publication called "myLibrary" that can be published to a Maven repository by virtue of its type: MavenPublication. This publication consists of just the production JAR artifact and its metadata, which combined are represented by the java component of the project.

组件是定义发布的标准方法. 它们是由插件提供的,通常是各种语言或平台的插件. 例如,Java插件定义components.java SoftwareComponent ,而War插件定义components.web .

该示例还定义了一个名为" myRepo"的基于文件的Maven存储库. 这样的基于文件的存储库对于示例来说很方便,但是实际构建通常可以与基于HTTPS的存储库服务器(例如Maven Central或内部公司服务器)一起使用.

您可以定义一个并且只有一个没有名称的存储库. 对于Maven存储库,这将转换为隐式名称" Maven",对于Ivy存储库,将其转换为隐式名称. 必须为所有其他存储库定义指定一个明确的名称.

结合项目的groupversion ,发布和存储库定义提供了Gradle发布项目生产JAR所需的所有内容. 然后Gradle将创建一个专用的publishMyLibraryPublicationToMyRepoRepository任务来完成该任务. 其名称基于publish PubName PublicationTo RepoName Repository模板. 请参阅相应的发布插件的文档,以获取有关此任务的性质以及您可能可用的任何其他任务的更多详细信息.

您可以直接执行单个发布任务,也可以执行publish ,它将运行所有可用的发布任务. 在此示例中, publish将仅运行publishMyLibraryPublicationToMavenRepository .

到Ivy存储库的基本发布非常相似:您只需使用Ivy Publish插件,用MavenPublication替换MavenPublication ,然后在存储库定义中使用ivy代替maven .

两种类型的存储库之间存在差异,尤其是每种存储库都支持的额外元数据之间存在差异(例如,Maven存储库需要一个POM文件,而Ivy存储库则具有自己的元数据格式),因此,请参阅插件章节以获取有关如何配置这两种配置的全面信息您正在使用的任何存储库类型的出版物和存储库.

这就是基本用例的全部内容. 但是,许多项目需要对发布的内容进行更多控制,因此我们在以下各节中介绍几种常见方案.