搭建Maven(Nexus)私服—实现模块化开发

搭建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 创建多个分支,采用多分支打包,需要上哪个分支就构建哪个(也只能手动切换了)。

参考

Android-Nexus 搭建自己的 Maven 仓库 & Gradle 上传依赖包

原创文章 25 获赞 12 访问量 1万+

猜你喜欢

转载自blog.csdn.net/half_bottle/article/details/82840734