教你一步步发布一个开源库到 JCenter
本篇文章已授權微信公眾號 dasu_Android(大蘇)獨家發布
今天想來分享下,如何一步步自己發布一個開源庫到 JCenter
這方面的博客網上已經特別多了,所以本篇并不打算僅僅只是記錄流程步驟而已,而是盡可能講清楚,為什么需要有這個步驟,讓大伙知其然的同時還知其所以然,那么掌握就會更深刻一點,所以本篇篇幅會很長。另外,本篇是參考、引用、借鑒了以下文章中的內容:
How to distribute your own Android library through jCenter and Maven Central from Android Studio
雖然是英文版,但有四級基礎就可以基本看懂了,文章寫得很全,很詳
實在不想看英文版的,國內有中文版翻譯,在《Android高級進階》的第 9 章有完整版的中文翻譯
前言
首先得想清楚一件事:是不是只有寫得很牛的開源庫,或者只有牛人、大神才可以發布開源庫到 JCenter呢?
可能有些人覺得自己不是大神,自己寫不出啥牛逼的開源庫,所以不用發布到 JCenter 上給別人用。所以,得先想清楚,你為什么要發布一個開源庫到 JCenter 上去?
學習也行;分享也行;自己用也行;總之,沒什么規定說只有大神才可以發布;
其實,這里之所以叫做開源庫,是因為發布到 JCenter 上之后,大伙都可以使用的原因。我更喜歡在《Android高級進階》里的說法:函數庫
我是帶著這么一種想法的:
作為一個懶人,一些可以在多個項目中使用的公共基礎模塊,實在不想每次新建項目都手動去復制粘貼,或者手動去導 Module,所以就想著將這些公共基礎模塊打包發布到 JCenter,以后新建項目時只要配置下 build.gradle 就可以了
Q:你問我為啥不上傳到私服?
A:沒錢
Q:你問我那不怕代碼被盜用?
A:又不是什么牛逼的開源庫,就是一些基本的公共模塊如工具類,網絡層封裝等等,別人想用,我高興還來不及,怕啥
Q:你問我那這些基礎模塊為啥不用別人開源的,還要自己造輪子?
A:自己的用著順手,自己的想怎么改就可以怎么改
Q:你問我那不怕發布的開源庫代碼太槽糕,被人罵?
A:老哥,我又不是大神,我要不寫這篇博客,都沒人知道我發布了個開源庫,反正就我自己使用,怕啥
Q:你問我...
A:老哥,別問了,趕快去發布一個試試看吧,萬一以后你就是大神了呢,省得到時再現學
好了,接下去就開始講發布的步驟了
步驟
先盜用開頭分享的鏈接里的一張圖
整個流程其實就是上圖中介紹的這樣,先本地打包成 jar 或 aar 文件,然后上傳到 bintray 自己的倉庫中,最后發布到 jcenter 上去就可以了。
除了第一步是在本地自己操作外,剩下的操作都是在網頁上移移鼠標點一點就可以了
第 0 步:JCenter 網址
https://bintray.com/
https://jcenter.bintray.com/
為什么會有兩個呢?那是因為,第一個是提供給我們可 ui 交互操作的網站,注冊賬號、配置倉庫、發布等等操作都是在第一個網址上面操作,我們也只要記住第一個網站就可以了
第二個是存放這些開源庫的網址,如果你想手動下載某個開源庫的 jar,那么你可以直接在第二個網址后面加上開源庫的路徑即可
比如,我之前寫過一篇 如何用Android Studio查看build.gradle源碼,某些情況下,Android Studio 并沒有成功將 Android Gradle 插件的源碼下載下來,我們又想去查看源碼時,只能自己去下載。寫那篇博客的時候 Android Studio 還是默認配置的 mavenCentral 作為開源庫拉取來源的。
但現在新版的 Android Studio 已經改成默認配置 JCenter 作為開源庫的來源了,舉個例子:
compile 'com.squareup.okhttp:okhttp:2.4.0'如果想手動下載 okhttp 的 jar 包,那么就是訪問:https://jcenter.bintray.com/com/squareup/okhttp/okhttp/2.4.0/
以此類推
第 1 步:注冊賬號 & 創建倉庫
1.1 注冊賬號
打開 https://bintray.com/ 網站,注冊一個賬號,也可以選擇直接 Github 賬號授權登錄,很簡單,不貼圖了。
1.2 創建倉庫
登錄賬號后,跟 Github 操作類似,bintray 允許你在網站上創建自己的倉庫,可 public,可 private。
創建倉庫的操作跟 Github 是類似的,我就不演示了,我這里創建了一個叫 base-module 的空倉庫。
接下去就跟 Github 的概念有點不一樣了,在 Github 上我們一個倉庫通常對應一個具體的項目,本地項目長啥樣,Github 上的倉庫基本也就長啥樣。
在 bintray 這里,一個倉庫我更傾向于把它就理解成倉庫的意思,也就是作為容器的作用。創建完一個空倉庫后,頁面右下角會有一個 Add New Package 按鈕,也就是倉庫下面還有一層 package 的概念。
一個 package 就是一個可發布到 JCenter 上的開源包,而發布到 JCenter 上的內容是一些 pom,aar,jar 之類的文件,并不是整個項目。所以我們需要先創建一個 package 來準備給本地需要打包發布的 module 生成 pom,aar 等文件的存放地了。
第 2 步:配置本地 gradle 腳本插件
上傳到 Github 上的是整個項目的源碼,而上傳到 bintray 上的是 pom, jar,arr 這類文件。
所以,在發布開源庫到 JCenter 之前,我們需要先在本地將要發布的 Module 打包成 jar, aar。那么,在本地要怎么操作呢?就像 Google 提供了 Android Gradle 插件來方便開發者直接對項目進行編譯一樣,bintray 也提供了相對應的 gradle 插件,來方便我們直接在本地打包成 jar。
同樣,Github 支持通過 Git 來將本地項目上傳到 Github 上,而 bintray 也提供了對應的 gradle 腳本來讓開發者將本地打包后的 jar 等上傳至 bintray 網站上的倉庫中。
這就是為什么我們需要在本地配置一些 gradle 插件的原因,一者方便開發者對項目進行編譯、打包成所需的文件;二者通過它提供的橋梁上傳至 bintray 網站上的倉庫。
2.1 配置 gradle 插件地址
使用 Android Gradle 插件,需要在根項目的 build.gradle 文件中配置:
dependencies {classpath 'com.android.tools.build:gradle:2.3.3' }同樣的道理,要使用 bintray gradle 插件,同樣也得在根項目的 build.gradle 文件中配置:
dependencies {//Android Gradle 插件classpath 'com.android.tools.build:gradle:2.3.3'//bintray 插件classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'//android-maven-gradle-plugin:1.3版本有bug,網上很多例子用的這個版本,編譯的時候可能會出錯,改一下版本就好了 }以上,只是配置了插件的路徑,那么使用插件的地方肯定就是在對應 module 下的 build.gradle 文件中了
2.2 使用 gradle 插件
gradle 插件使用的地方都是在每個具體 module 下的 build.gradle 文件中:
apply plugin: 'com.android.library'android {... }以上是常見的 build.gradle 文件,這表示的是,將會使用 Android gradle 插件中 id 為 com.android.library 的 gradle 插件來將該 Module 構建成一個 library,而 build.gradle 里其他配置項如 android 等則表示構建該項目所需的一些配置,這是我對 gradle 的理解(不知道對不對)。
同樣,因為上傳到 bintray 的是一些 pom, jar 文件,所以我們也需要在這個 build.gradle 中使用 bintray 提供的插件來編譯,打包項目:
//切記:以下代碼必須放在 build.gradle 文件末尾 apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'以上 apply from 指的是該 module 需要使用一個存儲于網上的 gradle 腳本文件來根據各種配置項來編譯、打包項目。
之所以這個 gradle 腳本文件存儲在網絡上,純粹是因為 bintray 擔心我們不知道怎么使用它提供的 gradle 插件來生成 pom, jar 等文件,所以連模板腳本都提供給我們了(這是我的理解)。
所以,你可以將 apply from 后面的鏈接在網頁上輸入看看,你會看到以下腳本:
//以下代碼大概瞄一眼即可,不用細看 apply plugin: 'com.github.dcendents.android-maven'group = publishedGroupId //開源庫的 groupIdinstall {repositories.mavenInstaller {// This generates POM.xml with proper parameterspom {project {packaging 'aar'//將項目打包成 aargroupId publishedGroupIdartifactId artifact// Add your description herename libraryNamedescription libraryDescriptionurl siteUrl// Set your licenselicenses {license {name licenseNameurl licenseUrl}}developers {developer {id developerIdname developerNameemail developerEmail}}scm {connection gitUrldeveloperConnection gitUrlurl siteUrl}}}} }這是一個將項目打包成 arr,并生成項目的 pom.xml 文件的腳本,這些文件都是要上傳到 bintray 網站上你的倉庫中去的。
所以,如果你知道使用 bintray gradle 插件都需要進行哪些配置的話,你完全可以自己在 build.gradle 將上述腳本中所需的配置直接寫上就好,不用使用 apply from;或者,你根據 apply from 后面的鏈接將腳本代碼復制粘貼到 build.grale 文件中也行。
同樣的道理,另外一個 apply from 所提供的 gradle 腳本內容我就不截圖了,那個腳本的作用是用于將生成的 pom, aar 等文件上傳至你的 bintray 網站的倉庫中去的。
也就是說,bintray 提供了兩個 gradle 插件,一個用于將本地項目編譯,打包成 aar,并生成所需的 pom.xml 等文件;另一個用于將生成的這些文件都上傳至你的 bintray 倉庫中去。同時,bintray 還提供了兩份腳本配置模板,如果不懂得怎么使用,就參照這兩份模板來就行了。
2.3 修改 gradle 腳本模板文件中的配置項
既然提供的僅僅是模板文件,那么具體的配置項肯定是需要我們根據自己的實際項目來進行配置的。有兩種方式:
- 不使用 apply from,直接將腳本模板文件里的代碼拷貝至 build.gradle 中,然后根據具體項目,手動修改每一個配置項(略麻煩,不推薦)
- 腳本模板文件中,每一個配置項都使用了對應的變量來配置,那么我們只需在 build.gradle 中聲明這些變量,并對變量進行賦值,就可以了
Android Gradle 編譯項目的用法其實就是第一種,但由于我們對 android 項目編譯要配置的項都挺熟悉了,加上 Android Studio 會自動生成一些必要的配置項,所以并不麻煩。但由于對 bintray gradle 插件的配置項不熟,個人不建議這里也使用這種方式。
而第二種方式,如果你有興趣再去網上搜索下其他的這類教程的文章,可能你會發現,很多文章都會讓你在 build.gradle 文件中寫這么一段代碼:
//下一步會具體來看每個配置項含義 ext {bintrayRepo = 'maven'bintrayName = 'fb-like'publishedGroupId = 'com.inthecheesefactory.thecheeselibrary'libraryName = 'FBLike'artifact = 'fb-like'... }現在可以理解,為什么他們要你寫這段代碼了吧。因為 bintray 提供的腳本模板文件中,對它所需的配置項都使用了相對應的變量,那么我們如果直接使用腳本模板文件,就需要對這些變量進行聲明并賦值,也就是說在 ext 中 聲明的 bintrayRepo, libraryName 等等這些變量,其實都是因為它們在 bintray 提供的腳本模板文件中被使用了。
另外,由于 gradle 腳本是按順序執行代碼,所以聲明這些變量的代碼必須在 apply from 代碼之前,否則如果先執行了 apply from,會報找不到相對應的變量錯誤。
還有一點,bintray gradle 插件源碼我沒去深入看,但要讓項目生成對應的 pom 項目說明文件,以及打包成 aar,所以我猜測,這表明 bintray gradle 插件內部除了腳本模板上所列的各種配置項外,還需要 Android Gradle 插件的一些配置項,比如 build.gradle 里的 android 塊配置項。
這也是為什么其他文章里提到說,要將 apply from 這幾行代碼放在 build.gradle 最后的原因。因為 gradle 腳本是按順序執行代碼,而 bintray gradle 插件的運行又依賴于一些 android 配置項,所以如果將 apply from 放在開頭的話,會報找不到一些變量的錯誤。
2.3.2 將變量的聲明賦值代碼寫在單獨的腳本文件中(可選)
如果不想讓 build.gradle 文件中有太多跟編譯項目本身無關的代碼,那么可以將跟 bintray gradle 插件相關的代碼都單獨寫在另外一個 gradle 文件中,然后在該 build.gradle 開頭通過 apply from 將那個 gradle 文件應用進來即可,有點類似于 import 的概念。
//build.gradle 文末 //bintray-config.gradle 就是跟 build.gradle 同層目錄下的一個 gradle 文件,里面就是單純將 exe {} 這塊代碼里的變量聲明和賦值拷貝至 bintray-config.gradle 文件里 apply from: 'bintray-config.gradle' apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'第 3 步:設置 gradle 插件中各種配置項
第 2 步在于配置各種所需的 gradle 插件以及如何使用,至于腳本模板的每一行代碼,感興趣的可以去深究,但不去管也么事,反正大概知道兩個腳本都干了什么事就行,怎么干的就不用去管了。
那么接下去就該了解一下,都需要對項目進行哪些屬性的配置,這些插件才可以正常運行,才可以正常的將開源庫上傳至 bintray 上的倉庫去:
3.1 各種基本配置項
ext {//bintray 網站上你創建的倉庫的名字(必配項)bintrayRepo = 'base-module'//在這個倉庫下的 package name(必配項)bintrayName = 'tv'//以上兩項均只是指向 bintray 網站上你的倉庫和倉庫下的package//publishedGroupId:artifact:libraryVersion 構成你開源庫的唯一路徑//例如:com.dasu.tv:tv:0.0.1,在build.gradle里就可以根據這個路徑來compile依賴庫了//以下三項均是必配項publishedGroupId = 'com.dasu.tv'artifact = 'tv'libraryVersion = '0.0.1'//以下三項只是對開源庫的描述(應該不是必配項吧,沒嘗試過)libraryName = 'tv'libraryDescription = 'dasu 封裝的常用,可公用的 tvui 庫'siteUrl = 'https://github.com/woshidasusu/base-module/tree/master/tv'//開源庫對應的 github 地址,不知道可不可以不配,應該也是必配gitUrl = 'https://github.com/woshidasusu/base-module.git'//開發者信息,也是必配的吧developerId = 'dasu'developerName = 'dasu'developerEmail = '295207731@qq.com'//這部分可以不用改,我也不大懂這些開源協議,但應該都一樣licenseName = 'The Apache Software License, Version 2.0'licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'allLicenses = ["Apache-2.0"] }就像 build.gradle 文件一樣,有些屬性必須配置后項目才可以正常編譯,運行。要使用 bintray gradle 插件來進行生成對應的 pom,aar 文件,上傳到 bintray 倉庫等功能,也必須進行一些屬性配置才行。
總之,對應在 bintray 倉庫的信息肯定需要配置,發布到 JCenter 后的唯一路徑也需要配置,開發者信息當然也需要,其他還需要一些開源庫的描述信息以及開源協議信息。
3.2 配置身份驗證信息(敏感信息)
經常使用 Github 肯定還覺得需要關鍵的用戶跟秘鑰信息是不是,否則使用 Git 上傳項目到 Github 上時沒辦法進行身份驗證。
同樣的道理,要將經過 bintray gradle 插件生成的 pom,aar 等上傳到 bintray 倉庫,同樣需要進行身份驗證,那么就配置一些用戶名和 key 的關鍵信息,但這些信息又極其敏感,隱私,所以只能配置在本地文件中。
如果不修改那兩份腳本模板文件的話,那么這些信息就需要配置在項目的根目錄下面的 local.properties 文件中:
//根目錄下的local.properties文件 bintray.user= woshidasusu bintray.apikey= XXXXXXXbintray.user 就是你的 bintray 網站的登錄賬號,如果你用 Github 授權登錄,就是你的 Github 賬號。
bindtray.apikey 需要進入 bintray 網站你的設置里去查看:
可能你在看別人寫的教程文章時,會發現他們在這里還配置了一個
bintray.gpg.password=YOUR_GPG_PASSWORD
這個應該是用于將 bintray 上的開源庫同步發布到 mavenCentral 倉庫里的驗證信息吧,反正我測試過,我沒配置這個,還是可以正常將本地開源庫上傳至 bintray 并發布到 JCenter 上面去。
第 4 步:執行 gradle 腳本
好了,bintray gradle 插件我們配置好了,它運行所需的各種屬性我們也配置好了,那么接下去就只是執行它而已了
如果本地有配置 gradle 環境的話,那么直接在 cmd 中以命令行的形式執行腳本即可。
如果沒有配置 gradle 環境,那么每個項目的根目錄下都有個 gradle 文件夾,里面有 gradle 命名行執行所需的文件,所以可以直接在 Android Studio 的 Terminal 里直接以命令行的形式執行對應腳本即可,如下:
那么如何運行 bintray gradle 插件的腳本呢?只需記錄兩條命令即可:
- gradlew install
- gradlew bintrayUpload
gradlew install 用于將項目編譯、打包生成 pom,aar 等文件;
gradlew bintrayUpload 用于將生成的 pom,aar 等文件上傳至 bintray 倉庫中;
跟編譯、運行項目一樣,當按順序分別執行上述兩條腳本命名時,如果運行成功,你可以在日志中看到 BUILD SUCCESSFUL 信息,同樣,如果腳本運行出錯,那么就需要根據日志查看是哪里的問題了,通常就是第 2 步跟第 3 步出了一些問題。
另外,你還可以通過在 build 文件夾下面查看是否有生成對應的文件來判斷 gradlew install 腳本有沒有成功執行。然后直接在 bintray 網站你的倉庫里查看文件是否有上傳來判斷 gradlew bintrayUpload 腳本是否有成功執行。
第 5 步:在 bintray 網站上將 package 發布到 JCenter
接下去就是最后一步了,登錄你的 bintray 賬號,進入你的倉庫里,找到上傳的開源庫,然后在頁面右下角找到 Add to JCenter 按鈕,點擊進去,按照要求填寫一下開源庫說明,然后就靜等幾個小時,等收到 JCenter 發給你的審核通過郵件,那么就成功了。
那么這時候,你就可以愉快的在你的新項目中的 build.gradle 文件里直接通過 compile 來將你的開源庫依賴到你項目中就可以了。
小結
以上,就是怎么一步步的將自己的開源庫打包發布到 JCenter 的步驟,小結一下,無外乎以下幾點:
最后,還有一篇專門記錄我自己在整個過程中遇到的一些問題以及解決方法記錄:
發布開源庫到JCenter的一些問題記錄
最近剛開通了公眾號,想激勵自己堅持寫作下去,初期主要分享原創的Android或Android-Tv方面的小知識,感興趣的可以點一波關注,謝謝支持~~
轉載于:https://www.cnblogs.com/dasusu/p/8999768.html
總結
以上是生活随笔為你收集整理的教你一步步发布一个开源库到 JCenter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东方红拖拉机554挂倒档不走
- 下一篇: 省省回头车一直没人接单怎么办