搭建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 = "admin" // 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时,添加依赖方未能及时更新
讯享网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 上传依赖包

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15665.html