使用Gradle發(fā)布開源項(xiàng)目到Maven Central
使用過(guò) Android Studio 的同學(xué)應(yīng)該都會(huì)對(duì) Gradle 這個(gè)強(qiáng)大的構(gòu)建系統(tǒng)留下了深刻的印象,Gradle 可以方便地集成各種開源庫(kù),又能編寫自動(dòng)化腳本處理任務(wù),大有取代 Maven 之勢(shì)。 業(yè)余時(shí)間我有在維護(hù)一個(gè)開源項(xiàng)目,也收到了幾個(gè) PR 要求發(fā)布到 Maven Central 以供 Gradle 使用,所以自己摸索著找了些文章,終于把項(xiàng)目發(fā)布上去了。
大概有以下 5 個(gè)步驟:
- 到 issues.sonatype.org 注冊(cè)個(gè)帳號(hào),申請(qǐng)發(fā)布權(quán)限
- 編寫 Gradle 自動(dòng)化發(fā)布腳本
- 下載 GPGTools,創(chuàng)建 Signing Key
- 執(zhí)行 Gradle 發(fā)布腳本
- 申請(qǐng)激活 Maven Central Sync 進(jìn)程
其中***步和第五步都需要人工審核,兩個(gè)工作日(美帝時(shí)間)內(nèi)會(huì)有答復(fù)。
1. 申請(qǐng) Maven Central 發(fā)布權(quán)限
將你的項(xiàng)目主要信息放到 issue 里面就好了,其中 Group Id 要謹(jǐn)慎填寫,申請(qǐng)通過(guò)后,你只能在你的 Group Id下發(fā)布項(xiàng)目。
創(chuàng)建完 issue 后,靜候幾天,通過(guò)了就會(huì)給你發(fā)郵件。
2. 編寫 Gradle 發(fā)布腳本
感謝 Chris Banes 大神提供的腳本,稍作修改,弄了一個(gè)我自己的版本。
https://github.com/SpecialCyCi/AndroidResideMenu/blob/master/maven_push.gradle
將上面的腳本放到項(xiàng)目的根目錄下,然后到開源庫(kù)所在的 module 目錄,添加以下代碼 build.gradle :
apply from: '../maven_push.gradle'
修改項(xiàng)目根目錄下的gradle.properties,添加項(xiàng)目的信息:
VERSION_NAME=1.6 VERSION_CODE=8 POM_GROUP_ID=com.specyci POM_DESCRIPTION=.... POM_URL=https://github.com/SpecialCyCi/AndroidResideMenu POM_SCM_URL=https://github.com/SpecialCyCi/AndroidResideMenu POM_SCM_CONNECTION=scm:git@github.com:SpecialCyCi/AndroidResideMenu.git POM_SCM_DEV_CONNECTION=scm:git@github.com:SpecialCyCi/AndroidResideMenu.git POM_LICENCE_NAME=The MIT License (MIT) POM_LICENCE_URL=https://raw.githubusercontent.com/SpecialCyCi/AndroidResideMenu/master/LICENSE POM_LICENCE_DIST=repo POM_DEVELOPER_ID=specialcyci POM_DEVELOPER_NAME=Special Leung POM_INCEPTION_YEAR=2013
***到開源庫(kù)所在的 module 目錄,添加編譯信息到 gradle.properties :
- POM_NAME=AndroidResideMenu
- POM_ARTIFACT_ID=residemenu
- POM_PACKAGING=aar
3. 下載 GPGTools,創(chuàng)建 Signing Key
Signing Key 可以看作是作者信息的一個(gè)簽名,簽名分為 public 和 private,其中 public key 要上傳到keyservers.net 儲(chǔ)存。
先在本地命令行生成 Signing Key :
➜ AndroidResideMenu git:(master) gpg --gen-key Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 8192 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: Special Leung(Testing) Email address: specialcyci+test@gmail.com Comment: This is just a testing key. You selected this USER-ID: "Special Leung(Testing) (This is just a testing key.) <specialcyci+test@gmail.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key. ... pub 2048R/8C1761A2 2015-01-24 Key fingerprint = xxx uid [ultimate] Special Leung(Testing) (This is just a testing key.) <specialcyci+test@gmail.com> sub 2048R/E32D1186 2015-01-24
然后把 public key 上傳到 keyservers.net :
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 8C1761A2 gpg: sending key 8C1761A2 to hkp server pool.sks-keyservers.net
***將 Signing Key 的信息填充到 ~/.gradle/gradle.properties :
# 查看 key 信息 ➜ ~ gpg --list-secret-keys /Users/special/.gnupg/secring.gpg # <- key 目錄 --------------------------------- sec 2048R/8C1761A2 2015-01-24 # <- 8C1761A2 是 key id uid Special Lenung(Testing) (This is just a testing key.) <specialcyci+test@gmail.com> ssb 2048R/E32D1186 2015-01-24
# ~/.gradle/gradle.properties signing.keyId=8C1761A2 signing.password=password signing.secretKeyRingFile=/Users/special/.gnupg/secring.gpg nexusUsername=username nexusPassword=password
4. 執(zhí)行 Gradle 發(fā)布腳本
%GRADLE_HOME%/bin/gradle uploadArchives
如果版本名含有 SNAPSHOT 字串,項(xiàng)目將會(huì)上傳到 snapshots 節(jié)點(diǎn);如果要發(fā)布到 Maven Central 的正式庫(kù),去掉版本名中的 SNAPSHOT 就可以,SNAPSHOT 版本不需要進(jìn)行第五步 Central Sync。
Snapshots 節(jié)點(diǎn):https://oss.sonatype.org/content/repositories/snapshots
5. 激活 Maven Central Sync 進(jìn)程
第 4 步成功了的話,就可以在 oss.sonatype.org (https://oss.sonatype.org/) 的 stagingRepositories 看到項(xiàng)目了,然后按下「Close」,準(zhǔn)備發(fā)布項(xiàng)目。
成功 Close 了項(xiàng)目后,到***步的 issue 地址,發(fā)個(gè)評(píng)論讓工作人員給你開啟 Sync 進(jìn)程,這個(gè)一般一個(gè)工作日就有答復(fù)。
在工作人員回復(fù)可以之后,執(zhí)行「Release」操作,沒啥意外的話,兩小時(shí)后就可以在 search.maven.org 搜到你的項(xiàng)目了。
6. 結(jié)語(yǔ)
總的來(lái)說(shuō),發(fā)布還是挺方便的,人工審核可能會(huì)浪費(fèi)點(diǎn)時(shí)間,偶爾還可能遇到些問(wèn)題,不過(guò) sonatype 還是很專業(yè)的,將你遇到的問(wèn)題告訴他們之后,都可以得到一個(gè)有效的解決辦法。
不過(guò)最近 Android Studio 把 jCentral 作為默認(rèn)的節(jié)點(diǎn)了,也許下次就得折騰 jCentral 了。