背景:之前自己弄的一些基礎(chǔ)庫(kù),示例代碼 都是在github托管,個(gè)別會(huì)發(fā)布到j(luò)center上窝稿,最近看打開(kāi)github 實(shí)在是太慢了就 想著遷移到 碼云 上托管吧,同時(shí)也該 重新搞搞自己的基礎(chǔ)庫(kù)凿掂,方便快速寫demo伴榔,同時(shí)發(fā)布到mavenCentral 上 (因?yàn)閖center 不維護(hù)了)
發(fā)布過(guò)程記錄如下:(參考: Android庫(kù)發(fā)布到Maven Central全攻略、 發(fā)布Android庫(kù)到MavenCentral教程)
基本按上面的參考文章去做就好庄萎,只不過(guò)有些點(diǎn)踪少,文章沒(méi)提到,或者時(shí)間隔得久了糠涛,某些步驟有變
一援奢、注冊(cè)
1、Maven Central是由sonatype運(yùn)營(yíng)的忍捡,https://issues.sonatype.org注冊(cè)賬號(hào)
2集漾、創(chuàng)建問(wèn)題,按上面的文章進(jìn)行操作就好锉罐,直到問(wèn)題狀態(tài)為關(guān)閉狀態(tài)
期間的交流如下
二帆竹、創(chuàng)建GPG秘鑰
1、因?yàn)間radle 上傳 的時(shí)候用到脓规,我們就先來(lái)創(chuàng)建GPG秘鑰好了栽连,我是只用了命令行去操作的,gpg --full-gen-key
2、加密方式選擇RSA and RSA秒紧,長(zhǎng)度輸入4096绢陌,過(guò)期時(shí)間直接回車不用管,然后輸入一個(gè)user ID并且提供一個(gè)郵箱熔恢,我直接用的我sonatype的用戶名和郵箱脐湾。最后一步輸入'O',表示OK
3叙淌、之后會(huì)彈出一個(gè)對(duì)話框秤掌,讓輸入密碼。后面gradle用到
三鹰霍、Gradle準(zhǔn)備
//publish-mavencentral.gradle
apply plugin: 'maven-publish'
apply plugin: 'signing'
task androidSourcesJar(type: Jar) {
archiveClassifier.set("sources")
from android.sourceSets.main.java.source
exclude "**/R.class"
exclude "**/BuildConfig.class"
}
Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream() ;
properties.load( inputStream )
ext {
PUBLISH_GROUP_ID = 'com.gitee.zaiqiang231'
PUBLISH_ARTIFACT_ID = 'base-lib'
PUBLISH_VERSION = '1.1.5'
}
ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
println "Found secret props file, loading props"
Properties p = new Properties()
p.load(new FileInputStream(secretPropsFile))
p.each { name, value ->
ext[name] = value
}
} else {
println "No props file, loading env vars"
}
publishing {
publications {
release(MavenPublication) {
// The coordinates of the library, being set from variables that
// we'll set up in a moment
groupId PUBLISH_GROUP_ID
artifactId PUBLISH_ARTIFACT_ID
version PUBLISH_VERSION
// Two artifacts, the `aar` and the sources
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
artifact androidSourcesJar
// Self-explanatory metadata for the most part
pom {
name = PUBLISH_ARTIFACT_ID
description = 'base lib'
// If your project has a dedicated site, use its URL here
url = 'https://gitee.com/zaiqiang231'
licenses {
license {
//協(xié)議類型闻鉴,一般默認(rèn)Apache License2.0的話不用改:
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'zaiqiang'
name = 'zaiqiang'
email = '461804160@qq.com'
}
}
// Version control info, if you're using GitHub, follow the format as seen here
scm {
//修改成你的Git地址:
connection = 'scm:git:gitee.com/zaiqiang231/BaseLib.git'
developerConnection = 'scm:git:ssh://gitee.com/zaiqiang231/BaseLib.git'
//分支地址:
url = 'https://gitee.com/zaiqiang231/BaseLib/tree/master'
}
// A slightly hacky fix so that your POM will include any transitive dependencies
// that your library builds upon
withXml {
def dependenciesNode = asNode().appendNode('dependencies')
project.configurations.implementation.allDependencies.each {
println "--- dependency ${it.group} ${it.name} ${it.version}"
if(it.group != null && it.group.length() > 0){
println "添加 dependency ${it.group} ${it.name} ${it.version}"
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
}
repositories {
// The repository to publish to, Sonatype/MavenCentral
maven {
// This is an arbitrary name, you may also use "mavencentral" or
// any other name that's descriptive for you
name = "baselib"
def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
// You only need this if you want to publish snapshots, otherwise just set the URL
// to the release repo directly
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
// The username and password we've fetched earlier
credentials {
username ossrhUsername
password ossrhPassword
}
}
}
}
signing {
sign publishing.publications
}
//local.properties
signing.keyId=剛才獲取的秘鑰后8位,gpg --list-keys茂洒∶系海可以查看剛剛建立的密鑰
signing.password=秘鑰密碼
signing.secretKeyRingFile=/Users/wuyanqiang/secring.gpg
ossrhUsername=賬號(hào)
ossrhPassword=密碼
四、上傳
1督勺、上傳 gpg (這一步應(yīng)該是 要的渠羞,一開(kāi)始gradle 和這個(gè)key 沒(méi)有上傳總是報(bào) 403 拒絕,后面上傳完這個(gè)key 和 改了上面gradle里面的地址就成功了智哀,我也不糾結(jié)了次询,主要是這個(gè)上傳key 找了幾個(gè)文章才解決了)命令操作如下:
上傳gpg http://www.reibang.com/p/c898c9082872
wuyanqiangdeMacBook-Pro:~ wuyanqiang$ gpg --keyserver keys.gnupg.net --send-keys DBCC9EBB38B960432204AC3E1617D07237F53108
gpg: sending key 1617D07237F53108 to hkp://hkps.pool.sks-keyservers.net
wuyanqiangdeMacBook-Pro:~ wuyanqiang$ gpg --keyserver keyserver.ubuntu.com --send-keys DBCC9EBB38B960432204AC3E1617D07237F53108
gpg: sending key 1617D07237F53108 to hkp://keyserver.ubuntu.com
2、gradle 上傳操作:
任務(wù):assemble
任務(wù):publishReleasePublicationToBaselibRepository
執(zhí)行完畢后盏触,進(jìn)入https://oss.sonatype.org/ 渗蟹,使用你的sonatype帳號(hào)和密碼登錄。
進(jìn)入左側(cè)的Staging Repositories 就能看到你上傳的東西了
3赞辩、先close, 再release授艰。就算是發(fā)布成功了辨嗽,第一次發(fā)布,回到之前建立的jira issue 回復(fù)一下淮腾,應(yīng)該就能加快同步了
到此 所有操作完畢
更新:
補(bǔ)充遇到的一個(gè)問(wèn)題:發(fā)布后糟需,依賴已發(fā)布的庫(kù),發(fā)現(xiàn)庫(kù)內(nèi)的子依賴 沒(méi)有成功谷朝,遇到一個(gè) 依賴錯(cuò)誤
發(fā)現(xiàn)其中有個(gè)依賴 有問(wèn)題洲押,排查發(fā)現(xiàn)是 api fileTree(dir: 'libs', include: ['*.jar']) 導(dǎo)致的,遍歷依賴時(shí)會(huì)有一個(gè)空依賴, 在上面的gradle 追加一段 過(guò)濾
withXml {
def dependenciesNode = asNode().appendNode('dependencies')
project.configurations.implementation.allDependencies.each {
println "--- dependency ${it.group} ${it.name} ${it.version}"
if(it.group != null && it.group.length() > 0){
println "添加 dependency ${it.group} ${it.name} ${it.version}"
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}