使用Gradle發(fā)布開源項目到Maven Central
使用過 Android Studio 的同學(xué)應(yīng)該都會對 Gradle 這個強大的構(gòu)建系統(tǒng)留下了深刻的印象,Gradle 可以方便地集成各種開源庫,又能編寫自動化腳本處理任務(wù),大有取代 Maven 之勢。 業(yè)余時間我有在維護一個開源項目,也收到了幾個 PR 要求發(fā)布到 Maven Central 以供 Gradle 使用,所以自己摸索著找了些文章,終于把項目發(fā)布上去了。
大概有以下 5 個步驟:
- 到 issues.sonatype.org 注冊個帳號,申請發(fā)布權(quán)限
- 編寫 Gradle 自動化發(fā)布腳本
- 下載 GPGTools,創(chuàng)建 Signing Key
- 執(zhí)行 Gradle 發(fā)布腳本
- 申請激活 Maven Central Sync 進程
其中***步和第五步都需要人工審核,兩個工作日(美帝時間)內(nèi)會有答復(fù)。
1. 申請 Maven Central 發(fā)布權(quán)限
將你的項目主要信息放到 issue 里面就好了,其中 Group Id 要謹慎填寫,申請通過后,你只能在你的 Group Id下發(fā)布項目。
創(chuàng)建完 issue 后,靜候幾天,通過了就會給你發(fā)郵件。
2. 編寫 Gradle 發(fā)布腳本
感謝 Chris Banes 大神提供的腳本,稍作修改,弄了一個我自己的版本。
https://github.com/SpecialCyCi/AndroidResideMenu/blob/master/maven_push.gradle
將上面的腳本放到項目的根目錄下,然后到開源庫所在的 module 目錄,添加以下代碼 build.gradle :
apply from: '../maven_push.gradle'
修改項目根目錄下的gradle.properties,添加項目的信息:
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
***到開源庫所在的 module 目錄,添加編譯信息到 gradle.properties :
- POM_NAME=AndroidResideMenu
- POM_ARTIFACT_ID=residemenu
- POM_PACKAGING=aar
3. 下載 GPGTools,創(chuàng)建 Signing Key
Signing Key 可以看作是作者信息的一個簽名,簽名分為 public 和 private,其中 public key 要上傳到keyservers.net 儲存。
先在本地命令行生成 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 字串,項目將會上傳到 snapshots 節(jié)點;如果要發(fā)布到 Maven Central 的正式庫,去掉版本名中的 SNAPSHOT 就可以,SNAPSHOT 版本不需要進行第五步 Central Sync。
Snapshots 節(jié)點:https://oss.sonatype.org/content/repositories/snapshots
5. 激活 Maven Central Sync 進程
第 4 步成功了的話,就可以在 oss.sonatype.org (https://oss.sonatype.org/) 的 stagingRepositories 看到項目了,然后按下「Close」,準備發(fā)布項目。
成功 Close 了項目后,到***步的 issue 地址,發(fā)個評論讓工作人員給你開啟 Sync 進程,這個一般一個工作日就有答復(fù)。
在工作人員回復(fù)可以之后,執(zhí)行「Release」操作,沒啥意外的話,兩小時后就可以在 search.maven.org 搜到你的項目了。
6. 結(jié)語
總的來說,發(fā)布還是挺方便的,人工審核可能會浪費點時間,偶爾還可能遇到些問題,不過 sonatype 還是很專業(yè)的,將你遇到的問題告訴他們之后,都可以得到一個有效的解決辦法。
不過最近 Android Studio 把 jCentral 作為默認的節(jié)點了,也許下次就得折騰 jCentral 了。