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配置即可。