简介
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()}StagingRepository
和 release${repository.name.capitalize()}StagingRepository
工作。
总结
这么好用的插件,连忙去试试吧。
本文已收录于 http://www.flydean.com/07-gradle-nexus-publish-plugin/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!