简介

Sonatype 提供了一个叫做开源软件资源库托管Open Source Software Repository Hosting (OSSRH) 的工具,帮忙咱们来不便的将我的项目公布到核心仓库中。

然而这个工具和咱们的我的项目构建是割裂的,尤其是在CI集成构建中,很难做到自动化。

Gradle是一个很好的构建工具,灵便而又弱小,可不可以间接在Gradle中的工作中间接构建和上传到地方仓库或者其余自定义的nexus仓库中呢?答案是必定的。

Gradle Nexus Publish Plugin历史

明天要给大家介绍的gradle插件名字叫做Gradle Nexus Publish Plugin,最近才公布了1.0.0版本,有小伙伴可能要问了,gradle进去这么久了,最近才有这样的插件吗?

其实不然,咱们来讲一下gradle Nexus公布插件的历史。

2015年,Marcin Zajączkowski创立了gradle-nexus-staging-plugin,该插件可在Nexus存储库管理器中敞开和开释staging存储库。应用这个插件就能够间接从代码中将Gradle我的项目公布到Maven Central仓库。多年来,它曾经在寰球各地被多个我的项目所采纳。

然而这个插件存在一个小问题: 因为Gradle公布过程中的技术限度,因而须要应用启发式技术来跟踪隐式创立的staging存储库,对于给定状态的多个存储库,通常会公布失败。尤其是在继续集成服务Travis CI在2019年末更改其网络架构之后,这个插件问题就更多了。

基于这个问题,马克·菲利普(Marc Philipp)创立了另外一个插件Nexus Publish Plugin,该插件丰盛了Gradle中的公布机制,能够显式创立staging存储库并间接向其公布(上传)组件。

通常咱们须要将这两个插件一起应用,然而,一个性能须要应用到两个插件还是会让用户感到困惑。所以Gradle Nexus Publish Plugin在2020/2021年应运而生了,它的目标就是合并下面两个插件的性能。

插件的应用

在gradle中应用该插件很简略,首先须要引入这个插件:

plugins {    id("io.github.gradle-nexus.publish-plugin") version "«version»"}
留神,这个插件必须在 Gradle 5.0 或者之后的版本应用,并且在根我的项目中引入。

接下来,咱们须要定义要公布的仓库,如果是通过Sonatype's OSSRH Nexus公布到Maven的地方仓库,那么须要增加sonatype(),如下所示:

nexusPublishing {    repositories {        sonatype()    }}

在sonatype()中,实际上定义了nexusUrl 和 snapshotRepositoryUrl。

公布到地方仓库是须要用户名明码的,咱们须要设置sonatypeUsername 和 sonatypePassword 这两个我的项目的属性。一种办法是在~/.gradle/gradle.properties 中进行配置,或者设置 ORG_GRADLE_PROJECT_sonatypeUsername 和 ORG_GRADLE_PROJECT_sonatypePassword 这两个环境变量。

或者,能够间接在sonatype 中进行定义:

nexusPublishing {    repositories {        sonatype {            username = "your-username"            password = "your-password"        }    }}

最初,调用publishToSonatype和 closeAndReleaseSonatypeStagingRepository就能够别离公布到Sonatype和敞开并公布到地方仓库了。

留神,下面的closeAndReleaseSonatypeStagingRepository实际上是蕴含了两步操作:close和release。咱们也能够仅仅调用closeSonatypeStagingRepository,而后手动登录Nexus UI,进行release操作。

上面是两个别离应用groovy和Kotlin的具体的例子:

Groovy DSL

plugins {    id "java-library"    id "maven-publish"    id "io.github.gradle-nexus.publish-plugin" version "«version»"}publishing {    publications {        mavenJava(MavenPublication) {            from(components.java)        }    }}nexusPublishing {    repositories {        myNexus {            nexusUrl = uri("https://your-server.com/staging")            snapshotRepositoryUrl = uri("https://your-server.com/snapshots")            username = "your-username" // defaults to project.properties["myNexusUsername"]            password = "your-password" // defaults to project.properties["myNexusPassword"]        }    }}

Kotlin DSL

plugins {    `java-library`    `maven-publish`    id("io.github.gradle-nexus.publish-plugin") version "«version»"}publishing {    publications {        create<MavenPublication>("mavenJava") {            from(components["java"])        }    }}nexusPublishing {    repositories {        create("myNexus") {            nexusUrl.set(uri("https://your-server.com/staging"))            snapshotRepositoryUrl.set(uri("https://your-server.com/snapshots"))            username.set("your-username") // defaults to project.properties["myNexusUsername"]            password.set("your-password") // defaults to project.properties["myNexusPassword"]        }    }}

默认状况下nexusPublishing中的connectTimeout和clientTimeout是5分钟,能够依据本人的须要进行调整。

插件背地的故事

咱们来看一下这个插件背地是怎么工作的。

首先定义的nexusPublishing { repositories { ... } } 会拦挡所有子项目的 maven-publish 插件,用来批改公布地址。

如果我的项目的版本号不是以-SNAPSHOT结尾,这阐明是公布版本,那么会创立一个initialize${repository.name.capitalize()}StagingRepository 工作,开启一个新的staging仓库,并且设置好对应的URL。在多我的项目构建中,所有领有雷同nexusUrl 的子项目,将会应用同样的staging仓库。

initialize${repository.name.capitalize()}StagingRepository为每个配置好的仓库地址,生成公布工作。

为每个公布工作生成一个 publishTo${repository.name.capitalize()} 生命周期task。

在公布工作之后别离创立 close${repository.name.capitalize()}StagingRepositoryrelease${repository.name.capitalize()}StagingRepository 工作。

总结

这么好用的插件,连忙去试试吧。

本文已收录于 http://www.flydean.com/07-gradle-nexus-publish-plugin/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!