今天想來分享下,如何一步步本身發佈一個開源庫到 JCenterandroid
這方面的博客網上已經特別多了,因此本篇並不打算僅僅只是記錄流程步驟而已,而是儘量講清楚,爲何須要有這個步驟,讓大夥知其然的同時還知其因此然,那麼掌握就會更深入一點,因此本篇篇幅會很長。另外,本篇是參考、引用、借鑑瞭如下文章中的內容:git
How to distribute your own Android library through jCenter and Maven Central from Android Studiogithub
雖然是英文版,但有四級基礎就能夠基本看懂了,文章寫得很全,很詳apache
實在不想看英文版的,國內有中文版翻譯,在***《Android高級進階》***的第 9 章有完整版的中文翻譯api
首先得想清楚一件事:是否是隻有寫得很牛的開源庫,或者只有牛人、大神才能夠發佈開源庫到 JCenter呢?bash
可能有些人以爲本身不是大神,本身寫不出啥牛逼的開源庫,因此不用發佈到 JCenter 上給別人用。因此,得先想清楚,你爲何要發佈一個開源庫到 JCenter 上去?網絡
學習也行;分享也行;本身用也行;總之,沒什麼規定說只有大神才能夠發佈;併發
其實,這裏之因此叫作開源庫,是由於發佈到 JCenter 上以後,大夥均可以使用的緣由。我更喜歡在《Android高級進階》裏的說法:函數庫app
我是帶着這麼一種想法的:maven
做爲一個懶人,一些能夠在多個項目中使用的公共基礎模塊,實在不想每次新建項目都手動去複製粘貼,或者手動去導 Module,因此就想着將這些公共基礎模塊打包發佈到 JCenter,之後新建項目時只要配置下 build.gradle 就能夠了
Q:你問我爲啥不上傳到私服?
A:沒錢
Q:你問我那不怕代碼被盜用?
A:又不是什麼牛逼的開源庫,就是一些基本的公共模塊如工具類,網絡層封裝等等,別人想用,我高興還來不及,怕啥
Q:你問我那這些基礎模塊爲啥不用別人開源的,還要本身造輪子?
A:本身的用着順手,本身的想怎麼改就能夠怎麼改
Q:你問我那不怕發佈的開源庫代碼太槽糕,被人罵?
A:老哥,我又不是大神,我要不寫這篇博客,都沒人知道我發佈了個開源庫,反正就我本身使用,怕啥
Q:你問我...
A:老哥,別問了,趕快去發佈一個試試看吧,萬一之後你就是大神了呢,免得到時再現學
好了,接下去就開始講發佈的步驟了
先盜用開頭分享的連接裏的一張圖
整個流程其實就是上圖中介紹的這樣,先本地打包成 jar 或 aar 文件,而後上傳到 bintray 本身的倉庫中,最後發佈到 jcenter 上去就能夠了。
除了第一步是在本地本身操做外,剩下的操做都是在網頁上移移鼠標點一點就能夠了
爲何會有兩個呢?那是由於,第一個是提供給咱們可 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/
以此類推
打開 bintray.com/ 網站,註冊一個帳號,也能夠選擇直接 Github 帳號受權登陸,很簡單,不貼圖了。
登陸帳號後,跟 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 等文件的存放地了。
上傳到 Github 上的是整個項目的源碼,而上傳到 bintray 上的是 pom, jar,arr 這類文件。
因此,在發佈開源庫到 JCenter 以前,咱們須要先在本地將要發佈的 Module 打包成 jar, aar。那麼,在本地要怎麼操做呢?就像 Google 提供了 Android Gradle 插件來方便開發者直接對項目進行編譯同樣,bintray 也提供了相對應的 gradle 插件,來方便咱們直接在本地打包成 jar。
一樣,Github 支持經過 Git 來將本地項目上傳到 Github 上,而 bintray 也提供了對應的 gradle 腳原本讓開發者將本地打包後的 jar 等上傳至 bintray 網站上的倉庫中。
這就是爲何咱們須要在本地配置一些 gradle 插件的緣由,一者方便開發者對項目進行編譯、打包成所需的文件;兩者經過它提供的橋樑上傳至 bintray 網站上的倉庫。
使用 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 文件中了
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 //開源庫的 groupId
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'//將項目打包成 aar
groupId publishedGroupId
artifactId artifact
// Add your description here
name libraryName
description libraryDescription
url siteUrl
// Set your license
licenses {
license {
name licenseName
url licenseUrl
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection gitUrl
developerConnection gitUrl
url 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 還提供了兩份腳本配置模板,若是不懂得怎麼使用,就參照這兩份模板來就好了。
既然提供的僅僅是模板文件,那麼具體的配置項確定是須要咱們根據本身的實際項目來進行配置的。有兩種方式:
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 放在開頭的話,會報找不到一些變量的錯誤。
若是不想讓 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'
複製代碼
第 2 步在於配置各類所需的 gradle 插件以及如何使用,至於腳本模板的每一行代碼,感興趣的能夠去深究,但不去管也麼事,反正大概知道兩個腳本都幹了什麼事就行,怎麼幹的就不用去管了。
那麼接下去就該瞭解一下,都須要對項目進行哪些屬性的配置,這些插件才能夠正常運行,才能夠正常的將開源庫上傳至 bintray 上的倉庫去:
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 後的惟一路徑也須要配置,開發者信息固然也須要,其餘還須要一些開源庫的描述信息以及開源協議信息。
常用 Github 確定還以爲須要關鍵的用戶跟祕鑰信息是否是,不然使用 Git 上傳項目到 Github 上時沒辦法進行身份驗證。
一樣的道理,要將通過 bintray gradle 插件生成的 pom,aar 等上傳到 bintray 倉庫,一樣須要進行身份驗證,那麼就配置一些用戶名和 key 的關鍵信息,但這些信息又極其敏感,隱私,因此只能配置在本地文件中。
若是不修改那兩份腳本模板文件的話,那麼這些信息就須要配置在項目的根目錄下面的 local.properties 文件中:
//根目錄下的local.properties文件
bintray.user= woshidasusu
bintray.apikey= XXXXXXX
複製代碼
bintray.user 就是你的 bintray 網站的登陸帳號,若是你用 Github 受權登陸,就是你的 Github 帳號。
bindtray.apikey 須要進入 bintray 網站你的設置裏去查看:
可能你在看別人寫的教程文章時,會發現他們在這裏還配置了一個
bintray.gpg.password=YOUR_GPG_PASSWORD
這個應該是用於將 bintray 上的開源庫同步發佈到 mavenCentral 倉庫裏的驗證信息吧,反正我測試過,我沒配置這個,仍是能夠正常將本地開源庫上傳至 bintray 併發布到 JCenter 上面去。
好了,bintray gradle 插件咱們配置好了,它運行所需的各類屬性咱們也配置好了,那麼接下去就只是執行它而已了
若是本地有配置 gradle 環境的話,那麼直接在 cmd 中以命令行的形式執行腳本便可。
若是沒有配置 gradle 環境,那麼每一個項目的根目錄下都有個 gradle 文件夾,裏面有 gradle 命名行執行所需的文件,因此能夠直接在 Android Studio 的 Terminal 裏直接以命令行的形式執行對應腳本便可,以下:
那麼如何運行 bintray gradle 插件的腳本呢?只需記錄兩條命令便可:
gradlew install
用於將項目編譯、打包生成 pom,aar 等文件;
gradlew bintrayUpload
用於將生成的 pom,aar 等文件上傳至 bintray 倉庫中;
跟編譯、運行項目同樣,當按順序分別執行上述兩條腳本命名時,若是運行成功,你能夠在日誌中看到 BUILD SUCCESSFUL
信息,一樣,若是腳本運行出錯,那麼就須要根據日誌查看是哪裏的問題了,一般就是第 2 步跟第 3 步出了一些問題。
另外,你還能夠經過在 build 文件夾下面查看是否有生成對應的文件來判斷 gradlew install
腳本有沒有成功執行。而後直接在 bintray 網站你的倉庫裏查看文件是否有上傳來判斷 gradlew bintrayUpload
腳本是否有成功執行。
接下去就是最後一步了,登陸你的 bintray 帳號,進入你的倉庫裏,找到上傳的開源庫,而後在頁面右下角找到 Add to JCenter 按鈕,點擊進去,按照要求填寫一下開源庫說明,而後就靜等幾個小時,等收到 JCenter 發給你的審覈經過郵件,那麼就成功了。
那麼這時候,你就能夠愉快的在你的新項目中的 build.gradle 文件裏直接經過 compile 來將你的開源庫依賴到你項目中就能夠了。
以上,就是怎麼一步步的將本身的開源庫打包發佈到 JCenter 的步驟,小結一下,無外乎如下幾點:
最後,還有一篇專門記錄我本身在整個過程當中遇到的一些問題以及解決方法記錄:
發佈開源庫到JCenter的一些問題記錄