1. 程式人生 > >Android Gradle上傳Maven倉庫

Android Gradle上傳Maven倉庫

在Android的gradle配置上追加上傳Maven的相關操作

maven的gradle外掛

Android裡內建了maven外掛 只需要apply plugin: “maven” 即可使用maven外掛

配置maven

配置maven倉庫地址

在root 下的build.gradle 的subprojects下的repositories中追加一下maven倉庫地址,表示給子專案新增倉庫地址

  maven {
            url "http://maven.release.test" 
        }
  maven {
            url "http://maven.test"
        }

統一配置maven的賬號資訊

我們現在setting.gradle中統一配置賬號資訊,留待下面使用

gradle.ext {
    // maven config
    mavenUrl = "http://maven.test.release"
    mavenDevUrl = "http://maven.test.snapshot"
    mavenUserName = "deployer"
    mavenPwd = "test"
}

其中:
mavenUrl表示正式倉庫地址
mavenDevUrl表示snapshot的倉庫(這裡我們分了2個倉庫 你也可以使用一個)
mavenUserName maven賬號的使用者名稱
mavenPwd macen賬號密碼

配置maven上傳

這裡用到的gradle.mavenUrl等 都是剛才在setting.gradle中配置好的

uploadArchives{
    repositories {
        mavenDeployer {
            repository(url: gradle.mavenUrl) {
                authentication(userName: gradle.mavenUserName, password: gradle.mavenPwd)
            }
            project.afterEvaluate {
                def versionName = "${android.defaultConfig.versionName}"
                def version = versionName;
                //修改pom檔案(maven的配置檔案)
                pom('aar').version = version;
                pom('aar').artifactId = "$project.name"
                pom('aar').groupId = "com.fsilence"  
            }
        }
    }
}

然後我們呼叫gradle 的uploadArchives 的task就可以了,之後可以在你的maven倉庫中檢視程式碼。在這裡我們的artifactid直接使用了當前專案的名稱,version使用了當前專案android中配置的版本號,你也可以手動設定不過不建議。
我們可以直接在build中呼叫 compile “com.fsilence:{project.name}:{version}”來應用了 例如 compile “com.fsilence:test:1.0.0”

配置SNAPSHOT 和 sources版本

我們在其它的開源軟體上經常能看到snapshot版本 和 帶原始碼的版本,那麼我們要怎麼配置呢? 我們先來看snapshot版本的配置, snapshot和release的區分主要是在版本號的結尾 如果版本號是以SNAPSHOT結尾的就會本認為是快照版本(其實合理可以用其它的字串只要和倉庫的開頭能匹配上即可),我們可以給snapshot版本配置特殊的倉庫:

   snapshotRepository(url: gradle.mavenDevUrl) {
          authentication(userName: gradle.mavenUserName, password: gradle.mavenPwd)
       }

為了標識打包的是snapshot還是其它版本,我會在專案下的gradle.properties檔案中定義個isSnapshot的變數如下:

isSnapshot = true

然後我們就可以在專案中通過project.isSnapshot來劃分版本了,然後我們將上面的配置程式碼加入snapshot版本的控制,

uploadArchives{
    repositories {
        mavenDeployer {
            repository(url: gradle.mavenUrl) {
                authentication(userName: gradle.mavenUserName, password: gradle.mavenPwd)
            }
            project.afterEvaluate {
                def versionName = "${android.defaultConfig.versionName}"
                def version = versionName;
                if (project.isSnapshot) {
                    version = "$versionName-SNAPSHOT"
                }
                //修改pom檔案(maven的配置檔案)
                pom('aar').version = version;
                pom('aar').artifactId = "$project.name"
                pom('aar').groupId = "com.fsilence"  
            }
        }
    }
}

然後我們再追加一個sources的版本控制,我們在每個版本都新增一個-sources的版本(包含原始碼的),首先我們得有一個打包原始碼的task:

task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

然後我們再次修改上面的配置,也就是我們最終的配置:

uploadArchives{
    repositories {
        mavenDeployer {
            repository(url: gradle.mavenUrl) {
                authentication(userName: gradle.mavenUserName, password: gradle.mavenPwd)
            }
            snapshotRepository(url: gradle.mavenDevUrl) {
                authentication(userName: gradle.mavenUserName, password: gradle.mavenPwd)
            }
            addFilter("aar-src"){artifact, file ->
                artifact.name == 'aar-src' || artifact.name == 'aar'
            }
            addFilter("aar"){artifact, file ->
                artifact.name == 'aar'
            }
            project.afterEvaluate {
                print project.isSnapshot
                def versionName = "${android.defaultConfig.versionName}"
                def version = versionName;
                def aarSrcVersion = "$versionName-sources";
                if (project.isSnapshot) {
                    version = "$versionName-SNAPSHOT"
                    aarSrcVersion += "-SNAPSHOT"
                }
                pom('aar').version = version;
                pom('aar').artifactId = "$project.name"
                pom('aar').groupId = "com.fsilence"
                pom('aar-src').artifactId = "$project.name"
                pom('aar-src').groupId = "com.fsilence"
                pom('aar-src').version = aarSrcVersion
            }
        }
    }
}

我們現在達到了這個效果:
1. 我們可以手動通過配置 isSnapshot來決定打包的是SnapSHot還是正式版本
2. 每個版本都有一個-sources的包是包含專案原始碼的
舉個例子我們的版本號可以是: 1.0.0 1.0.0-sources 1.0.0-SNAPSHOT 或者 1.0.0-sources-SNAPSHOT是不是很清晰。

解決gradle上使用maven版本不同步的問題

你以為這樣就ok了嗎,在實際中我還遇到一個問題,當你在開發釋出snap版本的時候,其它引用的地方總是不能及時更新,這是為什麼呢?最後我發現是因為gradle對jar包的快取問題,我們可以才用戶目錄的.android下的caches/modules-2/files中查詢到快取的檔案,這給實際開發造成了很大影響,解決方案有2個:
1.每次發的版本號都不相同,我們可以在版本號中間再插入一個git的版本號(或者你使用的是svn),git獲取版本號的程式碼如下:

def gitVersion = 'git rev-parse --short HEAD'.execute().text.trim()

這樣可以解決我們的問題但是有一個麻煩支出在於 ,引用包的地方必須知道你的git版本號,這可是很麻煩的,如果你又不希望對方知道你的git地址。所以這種方式個人不推薦
2.讓gradle每次都能去下載最新版本的maven倉庫,我們有一個dsl的配置如下:

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

然後在引用的地方我們改為:

compile ("com.fsilence:test:1.0.0-SNAPSHOT"){changing = true}

這樣我們每次呼叫的時候都會更新到最新版本,如果改成正式版本後曲調後面的changing配置即可。

這裡寫圖片描述