搭建Maven(Nexus)私服
概述
在开发过程中,需要集成Unity的资源,有190M。由于Unity修改比较频繁,git仓库越来越大,很快就达到了2G,由于还有很多其它module,每次构建都要很长的时间。为了减少clone的下载时间,提高构建速度,尝试将Unity资源打包为一个aar资源上传到maven私服,然后通过依赖引入到主工程,其它独立的module也可以这样操作。这样做的优点有一,与Unity解耦,减少主工程的体积;二,加快构建速度。当然缺点也是有的,多分支并行开发时,无法流畅地切换分支,与现在的git分支管理模型冲突了。不管如何,解耦Unity,将module发布到maven私服,总体上来说是有进步的,特此记录一下这个过程。
一、安装和配置Nexus
sonatype
win-zip下载地址
Quick Start Guide
根据Quick Start Guide中的步骤安装和配置即可
二、使用gradle上传aar/jar
2.1 root-gradle
在项目的根目录下的build.gradle添加上面搭建好的仓库地址
allprojects {
repositories {
google()
jcenter()
// 本地的仓库地址(Release和snapshots)
maven {
url "http://localhost:8081/repository/maven-releases"
}
maven {
url "http://localhost:8081/repository/maven-snapshots"
}
}
}
2.2 library.gradle
在需要上传到仓库的module的build.gradle文件添加上传到maven仓库的task:
apply plugin: 'maven'
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)
}
project.afterEvaluate {
print project.isSnapshot
def versionName = "${android.defaultConfig.versionName}"
def version = versionName
if (gradle.isSnapshot) {
version = "$versionName-SNAPSHOT"
}
pom.version = version
pom.artifactId = gradle.artifactId
pom.groupId = gradle.groupId
}
}
}
}
2.3 config.gradle
在根目录/其它模块的目录添加config.gradle,并在对应的build.gradle中引入(apply from: “config.gradle”),内容如下:
gradle.ext {
mavenUrl = "http://localhost:8081/repository/maven-releases" // 这是nexus 上的release仓库
mavenDevUrl = "http://localhost:8081/repository/maven-snapshots" // 这是nexus 上的snapshot仓库
groupId = "com.bottle" // 项目组
artifactId = "trek" // 模块
mavenUserName = "admin" // nexus 的账号和密码,可以配置在本地的gradle.properties中
mavenPwd = "admin123456" // nexus 的账号和密码,可以配置在本地的gradle.properties中
isSnapshot = true // 是否是 snapshot
}
2.4 执行gradle task : uploadArchives
完成上面步骤2的配置后,在对应模块中的Tasks中多一个task:upload-uploadArchives,执行这个任务即可把aar/jar上传到刚才所创建的maven仓库。
2.5 添加aar/jar依赖
在需要添加仓库中的依赖的项目的根目录的build.gradle添加刚才的仓库地址:
allprojects {
repositories {
jcenter()
google()
maven {
url "http://localhost:8081/repository/maven-snapshots/"
}
maven {
url "http://localhost:8081/repository/maven-releases/"
}
}
}
然后就可以使用compile/implementation引入依赖了
implementation 'com.bottle:trek:1.0.0-SNAPSHOT' // {groupId:artifactId :version-name}
三、 配置Jenkins,实现自动化构建
Unity打包,执行脚本:git add,git commit,git push 推送到这个新建的library库,然后触发这个library库的构建任务:uploadArchives,执行任务自动上传到maven。这样,这个library库就可以作为第三方依赖,引入到主项目中。具体Jenkins配置这里不讨论。
四. 遇到的问题
4.1 提交多个相同版本号的的snapshot时,添加依赖方未能及时更新
由于代码修改相对比较频繁,特别是改bug的时候,所以会经常提交新版本,如果每次都修改版本名称,那么很难实现自动化构建,所以考虑不修改版本号,使用snapshot(可以上传多个相同版本)。这样就产生了这个问题,不能及时更新。
网上有说添加如下配置可以下载到最新的aar包,但是实际中却不得行(android studio 3.1.3)
configurations.all {
resolutionStrategy {
// cache dynamic versions for 10 minutes
cacheDynamicVersionsFor 10*60, 'seconds'
// don't cache changing modules at all
cacheChangingModulesFor 0, 'seconds'
}
}
还有一种做法是使用gradle指令,刷新依赖,但是貌似也不起作用:
gradle build --refresh-dependencies
4.2 与git多分支并行开发有冲突
由于Unity模块有专门团队负责开发,按照需求,有时候会同时开发多个版本。而主项目中只能够引入一个依赖,在集成打包的时候就不能自动化打包了。大概证明了,这适合于相对独立的module,而不适合修改频繁甚至并行开发的功能模块。可以为Library 创建多个分支,采用多分支打包,需要上哪个分支就构建哪个(也只能手动切换了)。