教你一步步釋出一個開源庫到 JCenter

請叫我大蘇發表於2018-05-06

今天想來分享下,如何一步步自己釋出一個開源庫到 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:老哥,別問了,趕快去釋出一個試試看吧,萬一以後你就是大神了呢,省得到時再現學

好了,接下去就開始講釋出的步驟了

步驟

先盜用開頭分享的連結裡的一張圖

流程.png

整個流程其實就是上圖中介紹的這樣,先本地打包成 jar 或 aar 檔案,然後上傳到 bintray 自己的倉庫中,最後釋出到 jcenter 上去就可以了。

除了第一步是在本地自己操作外,剩下的操作都是在網頁上移移滑鼠點一點就可以了

第 0 步:JCenter 網址

bintray.com/

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 註冊賬號

開啟 bintray.com/ 網站,註冊一個賬號,也可以選擇直接 Github 賬號授權登入,很簡單,不貼圖了。

1.2 建立倉庫

登入賬號後,跟 Github 操作類似,bintray 允許你在網站上建立自己的倉庫,可 public,可 private。

建立模組.png

建立倉庫的操作跟 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 //開源庫的 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 還提供了兩份指令碼配置模板,如果不懂得怎麼使用,就參照這兩份模板來就行了

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= XXXXXXX
複製程式碼

bintray.user 就是你的 bintray 網站的登入賬號,如果你用 Github 授權登入,就是你的 Github 賬號。

bindtray.apikey 需要進入 bintray 網站你的設定裡去檢視:

APIkey.png

可能你在看別人寫的教程文章時,會發現他們在這裡還配置了一個

bintray.gpg.password=YOUR_GPG_PASSWORD

這個應該是用於將 bintray 上的開源庫同步釋出到 mavenCentral 倉庫裡的驗證資訊吧,反正我測試過,我沒配置這個,還是可以正常將本地開源庫上傳至 bintray 併發布到 JCenter 上面去。

第 4 步:執行 gradle 指令碼

好了,bintray gradle 外掛我們配置好了,它執行所需的各種屬性我們也配置好了,那麼接下去就只是執行它而已了

如果本地有配置 gradle 環境的話,那麼直接在 cmd 中以命令列的形式執行指令碼即可。

如果沒有配置 gradle 環境,那麼每個專案的根目錄下都有個 gradle 資料夾,裡面有 gradle 命名行執行所需的檔案,所以可以直接在 Android Studio 的 Terminal 裡直接以命令列的形式執行對應指令碼即可,如下:

terminal.png

那麼如何執行 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 指令碼是否有成功執行。

outputs.png

upload.png

第 5 步:在 bintray 網站上將 package 釋出到 JCenter

釋出到JCenter.png

接下去就是最後一步了,登入你的 bintray 賬號,進入你的倉庫裡,找到上傳的開源庫,然後在頁面右下角找到 Add to JCenter 按鈕,點選進去,按照要求填寫一下開源庫說明,然後就靜等幾個小時,等收到 JCenter 發給你的稽核通過郵件,那麼就成功了。

那麼這時候,你就可以愉快的在你的新專案中的 build.gradle 檔案裡直接通過 compile 來將你的開源庫依賴到你專案中就可以了。

小結

以上,就是怎麼一步步的將自己的開源庫打包釋出到 JCenter 的步驟,小結一下,無外乎以下幾點:

  1. 註冊 bintray 賬號(可用 Github 授權登入)
  2. 在 bintray 上建立倉庫,在倉庫下建立 package
  3. 準備好本地需要打包釋出的專案
  4. 在專案中配置 bintray gradle 外掛,有兩個,一個用於生成 aar,pom 等檔案;一個用於將這些檔案上傳至 bintray 倉庫;兩個外掛均在專案根目錄下的 build.gradle 配置外掛的 classPath 路徑即可
  5. 在要打包釋出的那個 Module 下的 build.grale 檔案中配置兩種外掛的使用,可直接使用 apply from 配置儲存在網上的指令碼檔案,也可將這指令碼模板檔案下載到本地使用
  6. apply from 必須要在 build.gradle 檔案末尾,另外 exe 程式碼塊需要在 apply from 前面,因為指令碼模板檔案使用的各種變數需要在 exe 塊中先進行宣告,賦值
  7. 理解 exe 塊中的各種配置項的含義
  8. 在 Android Studio 的 Terminal 皮膚直接執行 gradlew install, gradlew bintrayUpload 命令來執行指令碼
  9. 指令碼成功執行結束後,即可在 bintray 網站中找到 Add to JCenter 按鈕釋出到 JCenter,然後靜等郵件訊息

最後,還有一篇專門記錄我自己在整個過程中遇到的一些問題以及解決方法記錄:
釋出開源庫到JCenter的一些問題記錄


QQ圖片20180316094923.jpg
最近剛開通了公眾號,想激勵自己堅持寫作下去,初期主要分享原創的Android或Android-Tv方面的小知識,感興趣的可以點一波關注,謝謝支援~~

相關文章