Nexus構建Maven代理服務器讓Android依賴庫下載飛起

本文篇幅較長,僅想看教程的朋友請點擊電梯直達

在講述本文之前,先拋出個問題:爲什麼做Maven代理服務器?

我認爲有如下幾個原因 ~~~

why

1. jcenter和google等國外maven庫下載慢

我們在使用Android Studio開發項目時常常需要下載些依賴庫,這些庫往往因爲我大華夏族的wall變得難以下載(0.xxB/s的速度能下到你懷疑人生)或者索性連接不上,像醬紫:

於是,添加一些國內代理鏡像服務器的騷操作孕育而生,比如添加個阿里雲maven庫,此時你的gradle maven地址腳本可能是醬紫的:

repositories {
    // 添加阿里雲 maven 地址
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    jcenter()
    google()
}

它香嗎?是真的香!那種流暢下載的快感真是絕了…

然而他的缺點也有很多,比如依賴庫源稀少,依賴庫版本同步緩慢,而且阿里雲經常宕機和連接超時,有時候還不如直接用jcentergoogle庫的好。

嗯哼,這樣的操作彷彿並沒有多少改觀現狀。

2. 各個maven庫資源不盡相同,做不到統配資源

就上文而言,我們已經看到有3個maven庫了:aliyunjcentergoogle

實際開發過程中我們可能需要Gayhub上一些優秀的庫,那麼就要堆這個地址:

maven { url 'https://jitpack.io' }

有時候我們可能需要使用友盟相關服務sdk,我再堆:

maven { url 'https://dl.bintray.com/umsdk/release' }

有時候我們可能需要使用mob相關服務sdk,我繼續堆:

maven { url "http://mvn.mob.com/android" }

有時候。。。給我使勁往裏堆。。。最終你的庫地址腳本可能是醬紫的:

repositories {
    // 添加阿里雲 maven 地址
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    jcenter()
    google()
    maven { url 'https://jitpack.io' }
    maven { url 'https://dl.bintray.com/umsdk/release' }
    maven { url "http://mvn.mob.com/android" }
    aaa...
    bbb...
    ......
}

我要哭了,這麼多,腦子都炸了

3. 無法應對gradle頻繁性的刷新本地依賴緩存

由於gradle機制的特性,在開發過程中改變編譯策略或者一些改變gradle配置的舉動以及gradle緩存時效性的觸發都會導致gradle頻繁性的下載和更新本地依賴庫緩存。

一提到下載,一陣酸爽的味道撲面而來。。。

4. 開發夥伴間無法共享現成的依賴庫

比如A夥伴添加了一個流弊的控件庫niubility-widget-library到項目中,還可能需要引用某maven地址:http://mvn.niubility.com/ ,此時你的project下的build.gradle腳本是醬紫的:

repositories {
    bbb...
    ......
    // 某流弊的控件庫 maven 地址
        maven { url 'http://mvn.niubility.com/' }
}

需要使用的某module下的build.gradle腳本是醬紫的:

dependencies {
    ......
    // 某流弊的控件庫引用id
    implementation 'com.niubility:niubility-widget-library:1.0'
}

配置完後在就要sync一下,然後gradle就會進行令人窒息的下載依賴庫操作,emm…

之後同項目組的B夥伴同步了A夥伴的代碼,也得sync一下,然後。。。emm…

有一天另一個項目組的C夥伴覺得這個控件很流弊,於是找了A或B同事要了相關配置並集成到自己的項目,仍得sync一下,然後。。。emm…

我吐了! 每個人都要艱難得下載一遍,效率也忒差了吧!爲啥不能直接共享來自源頭A夥伴已下載好依賴庫呢?

嗯哼,既然有這麼多令人頭大的煩惱,也便有了迫切解決煩惱的需求,有了需求就得滿足,滋滋滋ZZZzzz…

話到這份子上了,要上教程了?不要着急,先分析一波工作原理 ~~~

what

1. 日常開發拉取依賴庫流程

a. AS(Android Studio) Gradle需要拉取某流弊依賴庫:niubility-widget-library:1.0

b. 按build.gradle添加maven地址的順序先向aliyun遠程庫請求拉取

c. 發現沒有該依賴,繼而轉向jcenter拉取

d. 也沒有,繼續轉… 直到niubility遠程庫

e. 有,於是愉快地將依賴庫響應給Gradle下載,拉取結束

假設niubility也沒有,且已經是最後一個倉庫了,那麼流程會是這樣的

f. 沒有,Gradle結束本次拉取並絕望地告訴你“Resource not found!”

2. 使用代理服務器的拉取依賴庫流程

a. AS Gradle需要拉取某流弊依賴庫:niubility-widget-library:1.0

b. 向代理服務器請求拉取

c. 代理服務器按添加代理maven庫的順序先向aliyun代理庫拉取

d. aliyun代理庫先詢問本地緩存庫有沒有

d. 沒有,則向aliyun遠程庫請求拉取

d. aliyun遠程庫也沒有,繼而轉向jcenter代理庫拉取

e. 折騰一波也沒有,繼續轉… 直到niubility倉庫

f. 本地緩存庫有,於是愉快地將緩存依賴庫響應給Gradle下載,拉取結束

假設niubility本地緩存庫沒有,則向niubility遠程庫請求拉取

g. 有,於是愉快地將依賴庫響應給niubility代理庫下載並緩存本地,然後響應給Gradle下載,拉取結束

再假設遠程庫也沒有,且已經是最後一個代理倉庫了,那麼流程會是這樣的

d. 沒有,告訴Gradle沒有,Gradle結束本次拉取並絕望地告訴你“Resource not found!”

額,語言描述有些蒼白,那就貼圖加持吧:

3. 總結Maven代理服務器的原理和優勢

分析上文1和2兩個流程可以看出:

  • Maven代理服務器接替並簡化了AS Gradle同各個Maven遠程庫繁雜的註冊和交互工作,其不需要再關心需要配置哪些Maven庫,以什麼方式拉取依賴庫,所需即所得。解決了why->2的問題。

  • Maven代理服務器每向遠程庫拉取依賴庫的同時會緩存至服務器本地,以便於AS Gradle的快速拉取。解決了why->3why->4的問題,緩解了why->1的問題。

別啊,漲粉不易啊親,這就開始 ~~~

how

1. Nexus Maven服務器搭建篇

參考此前文章《基於Nexus 3.x搭建Gradle Maven本地私有倉庫》的“一”和“二”步驟即可。 已搭建過的童鞋請罵罵咧咧地退出本步驟 ~~~

2. Maven代理服務器構建篇

  • 創建代理maven倉庫,本文以aliyun爲例

新建倉庫:

選擇maven2 (proxy)

任起倉庫名稱,填入aliyun遠程倉庫地址,其它默認直接創建:

同樣,再創建jcenter等代理倉庫

  • 創建代理maven倉庫組

參考上文流程,新建倉庫,選擇maven2 (group)

任起倉庫名組稱,選擇需要加入組的代理倉庫,其它默認直接創建:

創建完成後,返回到倉庫列表界面,找到剛創建的“android-repos”倉庫組一欄,點擊“copy”按鈕複製地址,本文爲:http://localhost:8081/repository/android-repos/

嗯哼,大功告成!你的gradle maven地址僅需一個代理庫組地址即可,其它地址可以全部拜拜了~

repositories {
    // 代理庫組地址
    maven { url 'http://localhost:8081/repository/android-repos/' }
}

如此簡潔的配置,你不心動嗎?如此高效的資源共享,你不心動嗎?如此6得飛起的下載速度,你不心動嗎?動手吧,騷年~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章