1. 程式人生 > >AndroidStudio使用進階二:搭建自己的maven私服,並使用Gradle統一依賴管理

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所說的,作為一個初級程式設計師,我的生活就是工作。前段曾為發一個版本搞了個通宵,然而發現最近有些急躁或者疲倦了,當然我也會及時的調整自己,我覺得保持持續的激情就是我們所說的堅持吧。這段老說自己很忙,但是我真的很忙嗎?我只是希望忙的時候多注意一些方法,要有效率,要有成果。