放棄JitPack,發(fā)布Android Library到Bintray、JCenter

Bug:升級(jí)到gradle tools 3.1.X, gradle version 4.6+, # novoda/bintray-release有個(gè)嚴(yán)重bug,導(dǎo)致上傳失敗com.novoda.gradle.release.AndroidLibrary$LibraryUsage.getGlobalExcludes()Ljava/util/Set #216. 作者說用gradle version 4.4,但筆者親測無效。作者目前還無解T_T

作者發(fā)布新庫 StefMa/bintray-release,試試

什么是JitPack

JitPack是一個(gè)網(wǎng)站,它允許你把git托管的java或android項(xiàng)目(貌似目前僅支持github),輕松發(fā)布到j(luò)itpack maven倉庫上。

什么是Bintray

Bintray是一個(gè)網(wǎng)站,它允許你創(chuàng)建私有maven、rpm、deb等倉庫。

你還可以在Bintray上提交審核,把已經(jīng)發(fā)布到bintray倉庫上的庫,發(fā)布到JCenter 。

為什么我不喜歡JitPack

JitPack看似傻瓜式的操作和配置,有時(shí)會(huì)造成更大的麻煩。例如,git項(xiàng)目有配置不對(duì),編譯不過去,幸運(yùn)的話,JitPack很快就能顯示錯(cuò)誤日志。但是,由于某些原因(有可能是墻的問題),JitPack遲遲不顯示日志(日志那個(gè)位置一直菊花)。配置各種不透明,例如groupId、artifactId配置不靈活,version只能跟發(fā)布版本......

只要編譯錯(cuò)誤,你必須修改代碼或配置(大多數(shù)是gradle配置原因),再push到git,再在JitPack選擇一個(gè)commit或release版本編譯、發(fā)布......作為工程師,編譯工程不能馬上收到反饋,是不能容忍的。如果發(fā)布庫前,能在本地編譯,從console馬上輸出SUCCESS或FAILURE,并且能定位詳細(xì)錯(cuò)誤日志,這是最好的。

筆者用nexus搭建過私有maven(《Android Studio上傳項(xiàng)目到Maven倉庫》),gradle配置并不難。 Bintray方案,用novoda plugin后,gradle配置很簡單,但注冊(cè)、創(chuàng)建package麻煩一點(diǎn)點(diǎn)(作為程序猿,注冊(cè)這點(diǎn)小事)。

在本地編譯發(fā)布,沒有JitPack的“延遲顯示編譯、配置錯(cuò)誤”的缺點(diǎn),有哪里配置不對(duì),編譯出問題馬上就能看到。


Bintray創(chuàng)建maven倉庫

Bintray注冊(cè)

打開 bintray.com,點(diǎn)擊右上角“Sign In”,進(jìn)入注冊(cè)界面。筆者建議你關(guān)聯(lián)github賬號(hào),注冊(cè)的細(xì)節(jié)筆者就不啰嗦了,相信你的智商。

bintray首頁
bintray signin

選擇maven倉庫

注冊(cè)好bintray賬號(hào)之后,默認(rèn)就有maven倉庫,并不需要自己創(chuàng)建。當(dāng)然你也可以“Add New Repository”繼續(xù)創(chuàng)建。

maven倉庫

創(chuàng)建Package

什么是package

你要發(fā)布一個(gè)庫,必須要配置groupId、artifactId。在bintray,必須創(chuàng)建package,才能發(fā)布庫,一個(gè)package對(duì)應(yīng)一個(gè)庫,這里的package并不是包名,而是與artifactId對(duì)應(yīng)。

例如,gradle引用gson:

compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'

group指定的com.google.code.gson就是groupId,name指定的gson,就是artifactId。如果gson是你的項(xiàng)目,并且發(fā)布到bintray,就需要?jiǎng)?chuàng)建gson package.

Add New Package

在maven倉庫頁面,點(diǎn)擊“Add New Package”,進(jìn)入package創(chuàng)建界面。

Add New Package
Package創(chuàng)建界面

我們需要發(fā)布的庫,artifactId=demo_package

  1. Name填寫"demo_package";
  2. Licenses選擇開源許可,可選Apache-2.0
  3. Version Control建議填github項(xiàng)目地址(實(shí)際上填什么都可以)

點(diǎn)擊“Create Package”,如無意外,package創(chuàng)建成功!

Package Create Success

Android工程配置

新建Android工程,并新建Android Library Module,module的package=com.bintray.library.

我們使用novada plugin,幫助我們快速配置。github官網(wǎng):novoda/bintray-release.

novoda目前已發(fā)布了0.5版本,由于筆者使用gradle 3.3,而novoda 0.5必須gradle 3.4+,因此筆者用0.4版本講解。

gradle配置

在project build.gradle添加:

buildscript {
    dependencies {
        classpath 'com.novoda:bintray-release:0.4.0'
    }
}

allprojects {
    repositories {
        maven { url 'https://dl.bintray.com/kkmike999/maven' }
    }
}

// 指定javadoc UTF-8格式
task javadoc(type: Javadoc) {
    options.encoding = "utf-8"
}

https://dl.bintray.com/kkmike999/maven是bintray個(gè)人maven倉庫地址,在maven頁面右上角找到:

然后,在library build.gradle添加 :

apply plugin: 'com.novoda.bintray-release'

android {
    lintOptions {
        abortOnError false
    }
}

publish {
    userOrg = 'kkmike999'      // bintray注冊(cè)的用戶名
    groupId = 'com.bintray.library'
    artifactId = 'demo_package'// bintray創(chuàng)建的package
    publishVersion = '1.0'
}

配置就大功告成了!


發(fā)布項(xiàng)目到Bintray

我們先去bintray找到發(fā)布需要的api key。在bintray右上角,點(diǎn)擊Edit Profile,進(jìn)入Profile界面,再選擇"API KEY"頁面,就可以找到API Key了:

Edit Profile
api key

在Android Studio的Terminal window,執(zhí)行命令行:

./gradlew clean build bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false

(注意,windows系統(tǒng),命令行前面不需要./)

bintray user 就是bintray注冊(cè)用戶名;
bintray api key 是 API Key.

很有可能報(bào)錯(cuò):

  • What went wrong:
    Execution failed for task ':library:releaseAndroidJavadocs'.
    Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): '...\BintrayDemo\library\build\tmp\releaseAndroidJavadocs\javadoc.options'

意思是執(zhí)行:library:releaseAndroidJavadocs任務(wù)時(shí)出錯(cuò)了,因此我們用命令跳過releaseAndroidJavadocs任務(wù)。

在命令行后加-x releaseAndroidJavadocs(-x意思是跳過某個(gè)任務(wù)),則整句命令行:

./gradlew clean build bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false -x releaseAndroidJavadocs

如果執(zhí)行結(jié)果顯示:

BUILD SUCCESSFUL

Total time: ... secs

發(fā)布成功了!

打開bintray demo_package頁面,如果顯示了版本信息,證明發(fā)布的庫正常:

1.0 version

提示:發(fā)布成功后,bintray界面版本信息有一定延時(shí),等半分鐘左右,多刷新幾次頁面。

通過gradle任務(wù)發(fā)布

在Android Studio Gradle projects window,點(diǎn)擊Run Gradle Task按鈕,Gradle project選擇整個(gè)project,Command line填入:

clean build generatePomFileForReleasePublication releaseAndroidJavadocs releaseAndroidJavadocsJar releaseAndroidSourcesJar publishReleasePublicationToMavenLocal
 bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false
Command line

Terminal執(zhí)行bintrayUpload任務(wù),會(huì)自動(dòng)執(zhí)行generatePomFileForReleasePublicationreleaseAndroidJavadocsreleaseAndroidJavadocsJarreleaseAndroidSourcesJarpublishReleasePublicationToMavenLocal,但Run Gradle Task時(shí)并不會(huì),因此要手動(dòng)添加這些任務(wù)。還有,不需要跳過releaseAndroidJavadocs了,這種方式能執(zhí)行成功。

執(zhí)行任務(wù)后,任務(wù)會(huì)在Gradle projects保留,如果想修改執(zhí)行命令和參數(shù),可以對(duì)該任務(wù)右鍵->Edit Run Configuration:

Edit Run Configuration

Edit Run Configuration Detail

發(fā)布庫到JCenter

這一步非常簡單。

在package頁面,點(diǎn)擊"Add To JCenter",再填寫開源庫說明,提交審核。

等待Bintray審核通過。審核非常快,基本等一天就可以了。提交到JCenter后,引用庫時(shí),不再需要定義自己maven倉庫地址。


Markdown逼格小圖標(biāo)

你會(huì)發(fā)現(xiàn)別人github readme有幾個(gè)很高逼格的icon:

我們也要做這種效果! 在package頁面,點(diǎn)擊"Latest Version Badge",就會(huì)顯示icon markdown代碼:

download icon
[![Download](https://api.bintray.com/packages/kkmike999/maven/demo_package/images/download.svg) ](https://bintray.com/kkmike999/maven/demo_package/_latestVersion)

另外,shields.io這個(gè)網(wǎng)站有大量這種icon示例。


常見問題

除了上文提到的Execution failed for task ':library:releaseAndroidJavadocs'.之外,還有一些常見編譯錯(cuò)誤。

artifactId與package name不一致

:library:bintrayUpload FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':library:bintrayUpload'.
> Could not create package 'kkmike999/maven/demo': HTTP/1.1 400 Bad Request [message:Please enter a valid VCS URL for your package.]

錯(cuò)誤中說package 'kkmike999/maven/demo',然而我們的package是kkmike999/maven /demo_package,這是publish.artifactId與在bintray創(chuàng)建的package name不一致造成的。

解決方法:gradle修改publish.artifactId,或在bintray重新創(chuàng)建package,保持artifactId與package一致。

重復(fù)提交相同版本

如果你已經(jīng)發(fā)布了1.0版本到bintray,再次發(fā)布1.0,就會(huì)報(bào)這個(gè)錯(cuò)誤:

* What went wrong:
Execution failed for task ':library:bintrayUpload'.

> Could not upload to 'https://api.bintray.com/content/kkmike999/maven/demo_package/1.0/com/bintray/library/demo_package/1.0/demo_package-1.0-sources.jar': HTTP/1.1 409 Conflict [message:Unable to upload files: An artifact with the path 'com/bintray/library/demo_package/1.0/demo_package-1.0-sources.jar' already exists]

解決方法:gradle修改publish.publishVersion,或者在bintray刪除當(dāng)前版本,再重新發(fā)布。

參考

《Android 發(fā)布項(xiàng)目到 jcenter 遇到的坑》

novoda issues


關(guān)于作者

我是鍵盤男。
在廣州生活,悅跑圈Android工程師,猥瑣文藝碼農(nóng)。每天謀劃砍死產(chǎn)品經(jīng)理。喜歡科學(xué)、歷史,玩玩投資,偶爾旅行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容