使用gradle插件发布项目到nexus中央仓库
文章目錄
- 簡介
- Gradle Nexus Publish Plugin歷史
- 插件的使用
- Groovy DSL
- Kotlin DSL
- 插件背后的故事
- 總結(jié)
簡介
Sonatype 提供了一個叫做開源軟件資源庫托管Open Source Software Repository Hosting (OSSRH) 的工具,幫助我們來方便的將項目發(fā)布到中心倉庫中。
但是這個工具和我們的項目構(gòu)建是割裂的,尤其是在CI集成構(gòu)建中,很難做到自動化。
Gradle是一個很好的構(gòu)建工具,靈活而又強大,可不可以直接在Gradle中的任務(wù)中直接構(gòu)建和上傳到中央倉庫或者其他自定義的nexus倉庫中呢?答案是肯定的。
Gradle Nexus Publish Plugin歷史
今天要給大家介紹的gradle插件名字叫做Gradle Nexus Publish Plugin,最近才發(fā)布了1.0.0版本,有小伙伴可能要問了,gradle出來這么久了,最近才有這樣的插件嗎?
其實不然,我們來講一下gradle Nexus發(fā)布插件的歷史。
2015年,Marcin Zaj?czkowski創(chuàng)建了gradle-nexus-staging-plugin,該插件可在Nexus存儲庫管理器中關(guān)閉和釋放staging存儲庫。使用這個插件就可以直接從代碼中將Gradle項目發(fā)布到Maven Central倉庫。多年來,它已經(jīng)在全球各地被多個項目所采用。
但是這個插件存在一個小問題: 由于Gradle發(fā)布過程中的技術(shù)限制,因此需要使用啟發(fā)式技術(shù)來跟蹤隱式創(chuàng)建的staging存儲庫,對于給定狀態(tài)的多個存儲庫,通常會發(fā)布失敗。尤其是在持續(xù)集成服務(wù)Travis CI在2019年末更改其網(wǎng)絡(luò)架構(gòu)之后,這個插件問題就更多了。
基于這個問題,馬克·菲利普(Marc Philipp)創(chuàng)建了另外一個插件Nexus Publish Plugin,該插件豐富了Gradle中的發(fā)布機制,可以顯式創(chuàng)建staging存儲庫并直接向其發(fā)布(上傳)組件。
通常我們需要將這兩個插件一起使用,但是,一個功能需要使用到兩個插件還是會讓用戶感到困惑。所以Gradle Nexus Publish Plugin在2020/2021年應(yīng)運而生了,它的目的就是合并上面兩個插件的功能。
插件的使用
在gradle中使用該插件很簡單,首先需要引入這個插件:
plugins {id("io.github.gradle-nexus.publish-plugin") version "?version?" }注意,這個插件必須在 Gradle 5.0 或者之后的版本使用,并且在根項目中引入。
接下來,我們需要定義要發(fā)布的倉庫,如果是通過Sonatype’s OSSRH Nexus發(fā)布到Maven的中央倉庫,那么需要添加sonatype(),如下所示:
nexusPublishing {repositories {sonatype()} }在sonatype()中,實際上定義了nexusUrl 和 snapshotRepositoryUrl。
發(fā)布到中央倉庫是需要用戶名密碼的,我們需要設(shè)置sonatypeUsername 和 sonatypePassword 這兩個項目的屬性。一種方法是在~/.gradle/gradle.properties 中進行配置,或者設(shè)置 ORG_GRADLE_PROJECT_sonatypeUsername 和 ORG_GRADLE_PROJECT_sonatypePassword 這兩個環(huán)境變量。
或者,可以直接在sonatype 中進行定義:
nexusPublishing {repositories {sonatype {username = "your-username"password = "your-password"}} }最后,調(diào)用publishToSonatype和 closeAndReleaseSonatypeStagingRepository就可以分別發(fā)布到Sonatype和關(guān)閉并發(fā)布到中央倉庫了。
注意,上面的closeAndReleaseSonatypeStagingRepository實際上是包含了兩步操作:close和release。我們也可以僅僅調(diào)用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分鐘,可以根據(jù)自己的需要進行調(diào)整。
插件背后的故事
我們來看一下這個插件背后是怎么工作的。
首先定義的nexusPublishing { repositories { ... } } 會攔截所有子項目的 maven-publish 插件,用來修改發(fā)布地址。
如果項目的版本號不是以-SNAPSHOT結(jié)尾,這說明是發(fā)布版本,那么會創(chuàng)建一個initialize${repository.name.capitalize()}StagingRepository 任務(wù),開啟一個新的staging倉庫,并且設(shè)置好對應(yīng)的URL。在多項目構(gòu)建中,所有擁有相同nexusUrl 的子項目,將會使用同樣的staging倉庫。
initialize${repository.name.capitalize()}StagingRepository為每個配置好的倉庫地址,生成發(fā)布任務(wù)。
為每個發(fā)布任務(wù)生成一個 publishTo${repository.name.capitalize()} 生命周期task。
在發(fā)布任務(wù)之后分別創(chuàng)建 close${repository.name.capitalize()}StagingRepository 和 release${repository.name.capitalize()}StagingRepository 任務(wù)。
總結(jié)
這么好用的插件,趕緊去試試吧。
本文已收錄于 http://www.flydean.com/07-gradle-nexus-publish-plugin/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!
總結(jié)
以上是生活随笔為你收集整理的使用gradle插件发布项目到nexus中央仓库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看动画学算法系列之:后缀数组suffix
- 下一篇: NumPy之:NumPy简介教程