Sonatype 提供了一个叫作开源软件资源库托管Open Source Software Repository Hosting (OSSRH) 的工具,帮助咱们来方便的将项目发布到中心仓库中。java
可是这个工具和咱们的项目构建是割裂的,尤为是在CI集成构建中,很难作到自动化。git
Gradle是一个很好的构建工具,灵活而又强大,可不能够直接在Gradle中的任务中直接构建和上传到中央仓库或者其余自定义的nexus仓库中呢?答案是确定的。github
今天要给你们介绍的gradle插件名字叫作Gradle Nexus Publish Plugin,最近才发布了1.0.0版本,有小伙伴可能要问了,gradle出来这么久了,最近才有这样的插件吗?api
其实否则,咱们来说一下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存储库并直接向其发布(上传)组件。maven
一般咱们须要将这两个插件一块儿使用,可是,一个功能须要使用到两个插件仍是会让用户感到困惑。因此Gradle Nexus Publish Plugin在2020/2021年应运而生了,它的目的就是合并上面两个插件的功能。工具
在gradle中使用该插件很简单,首先须要引入这个插件: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的具体的例子:
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"] } } }
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()}StagingRepository
和 release${repository.name.capitalize()}StagingRepository
任务。
这么好用的插件,赶忙去试试吧。
本文已收录于 http://www.flydean.com/07-gradle-nexus-publish-plugin/
最通俗的解读,最深入的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注个人公众号:「程序那些事」,懂技术,更懂你!