AndroidStudio使用進階二:搭建自己的maven私服,並使用Gradle統一依賴管理
前言:
最近我們老大組織了我們軟體團隊開了一個小會,說了一些存在的問題,平時在技術上的交流還是比較少的,尤其是在不同的專案之間的開發人員,然而經過這次會議我突然發現,我的缺陷不僅是在基礎的能力上,還有一點就是對新的技術,程式設計思想知之甚少,就用low來形容吧。所以即使再忙也不能把自己陷在敲程式碼的體力活中,有時候真得跳出來多看看,瞭解一些主流的技術,使用一些工具,既節約時間,而且可以寫出一份優秀的程式碼。
問題:
- 將Android專案從Eclipse轉到AndroidStudio後,我們所有的依賴,jar,aar包等必須要保持一致,不然就會衝突構建失敗。
- 如果依賴的module太多,構建一個project時每個依賴的module都需要構建,比較費時,然後我也不想去copy已經編譯好的aar,因為有時候需要修改依賴的module,需要開啟原始碼,修改後需要上傳新版本的aar等等。
方案:
參考了大神們Gradle統一依賴的管理方式,並再次加工,將所有的依賴放到一個config.gradle的配置檔案裡邊。同時寫好依賴maven私庫和原始碼的module的配置,這樣就可以在原始碼和aar之間自由切換。
準備工作:使用Nexus Repository搭建maven私服
搭建maven私服很簡單,可以參考 Android 專案部署之Nexus私服搭建和應用,公司已經搭好了maven私庫,但是畢竟是公共的,不是那麼自由,所以我就搭在本地了。下面是主要的一些配置。
Maven的配置檔案:D:\xxx\Maven\apache-maven-3.3.9\conf\settings.xml
<localRepository>E:\***\repository</localRepository> //本地倉庫地址,先行建立好資料夾 //nexus服務 <server> <id>my-nexus-releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>my-nexus-snapshot</id> <username>admin</username> <password>admin123</password> </server> //映象 <mirror> <id>nexus</id> <url>http://localhost:8081/nexus/content/groups/public/</url> <mirrorOf>*</mirrorOf> </mirror> //nexus倉庫配置 <profile> <id>nexusProfile</id> <repositories> <repository> <id>nexus</id> <name>Nexus Repository</name> <url>http://xxx.xx.xx.xx:8081/nexus/content/groups/public/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> //啟用 <activeProfiles> <activeProfile>nexusProfile</activeProfile> </activeProfiles>
演示專案:
假設app為主工程,依賴的lib3,lib2,而lib2依賴了lib1。
settings.gradle 配置
include ':lib1'
include ':lib2'
include ':lib3'
include ':app'
maven私庫配置,根目錄下的build.gradle中的配置
apply from:"config.gradle" //配置統一依賴管理檔案
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
allprojects {
repositories {
jcenter()
maven { url MAVEN_URL }//配置maven私服
}
}
全域性變數,根目錄下的gradle.properties
MAVEN_URL= http://xxx.xx.xx.xx:8081/nexus/content/repositories
MAVEN_SNAPSHOT_URL = http://xxx.xx.xx.xx:8081/nexus/content/repositories/thirdparty-snapshot/
#對應maven的groupId值
GROUP=group
#登入nexus oss的使用者名稱
NEXUS_USERNAME=admin
#登入nexus oss的密碼
NEXUS_PASSWORD=admin123
# groupid
GROUP_ID = group
# type
TYPE = aar
# description
DESCRIPTION = dependences lib
`
app的build.gradle
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile rootProject.ext.dependencies["lib2"]
compile rootProject.ext.dependencies["lib3"]
}
lib2的build.gradle
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile rootProject.ext.dependencies["lib1"]
}
自動配置上傳aar到maven私庫的配置
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
snapshotRepository(url: MAVEN_SNAPSHOT_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
repository(url: MAVEN_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
version rootProject.ext.uploadArchives["lib1"]//版本號
artifactId 'lib1'
groupId GROUP_ID
packaging TYPE
description DESCRIPTION
}
}
}
}
統一依賴config.gradle
// 依賴全域性控制 原始碼工程和maven私庫的aar自由控制,比如現在 lib2依賴lib1的aar 只要註釋下方的原始碼依賴,開啟上面的maven依賴即可
dependencies = [
"lib1" : 'group:lib1:1.0.0+',
//"lib2" : 'group:lib2:1.0.0+',
//"lib3" : 'group:lib3:1.0.0+',
// "lib1" : project(':lib1'),//lib2(我在後邊註明依賴lib1的工程lib2,依賴關係一目瞭然)
"lib2" : project(':lib2'),//app
"lib3" : project(':lib3'),//app
]
//上傳時修改aar版本號
uploadArchives = [
lib1 : "1.0.0",
lib1 : "1.0.0",
lib1 : "1.0.0"
]
注意:
這麼搞有個問題,如果一個lib2依賴的是lib1,那麼此時構建生成的aar,會將依賴lib1的aar版本打包一起上傳到maven,所以我在版本號後邊增加了“+”號,永遠保持依賴最新的。
如果lib1打開了原始碼,那麼依賴了lib1的module也要開啟原始碼,逐層上推。
請教:
我將所有的依賴都放到config.gradle中,一是為了方便管理,二是希望能夠實現每個module可以在原始碼和aar之間自由的切換,但是第二點並沒有達到最理想的效果,求大神們給出更好的方案。
結語:
這篇部落格還是上週寫了一大半,中間有些事情耽擱了,一直拖到現在。今晚和一個老同學聊天,我問道她一個問題:站在女生的角度來說,你希望找的男朋友是事業有成的呢?還是願意找個一無所有的一起創造的呢?她的回答是:其實重點是會照顧人,對女朋友好,當然事業有成最好咯,但往往很少啦,如果不是,至少要是個潛力股,還有,如果真的在乎那個女孩,就算她願意陪你吃苦,你也是不願意她為你吃苦的。我覺得說的很真實,所以,還是加油吧。現在辦公室就我一個人,開啟音響可以放心的把音量調高一點,這樣算是給自己一點放鬆吧。這段一直關注stormzhang的公眾號AndroidDeveloper,裡邊的一篇:我到底有多麼拼命,的確和他比確實弱爆了。或許就如stormzhang所說的,作為一個初級程式設計師,我的生活就是工作。前段曾為發一個版本搞了個通宵,然而發現最近有些急躁或者疲倦了,當然我也會及時的調整自己,我覺得保持持續的激情就是我們所說的堅持吧。這段老說自己很忙,但是我真的很忙嗎?我只是希望忙的時候多注意一些方法,要有效率,要有成果。