为了账号安全,请及时绑定邮箱和手机立即绑定

Kotlin与Java混编项目的Nexus私有仓库持续交付与集成

标签:
Kotlin

关于 Android 开发结合 Nexus 仓库的使用已经有很多相关文章了,但大多是纯 Java 工程的应用。我使用 Kotlin 开发已有半年多了,愈发感觉 Kotlin 好用。现在新项目的开发中,95%以上的代码使用 Kotlin 编写,旧的项目也逐渐升级。随着项目规模的不断变大,模块越来越多,每次编译都十分耗时。而新项目使用旧有模块,需要手动拷贝,版本控制也是个问题。为了解决这个问题,我们搭建了私有 Nexus 仓库。相对稳定的模块直接通过私有仓库管理,在打包上传包含 Kotlin 的模块时,遇到了一些问题,这里记录下,大家有需要可以参考下。

搭建 Nexus 仓库

搭建 Nexus 仓库的文章相比有很多,官方也提供了详细的文档。但如果想快速搭建,建议使用 Docker,只需一行命令,当然前提是你已经安装了 Docker。在 Docker hub 搜索下


webp

Docker hub Nexus 搜索结果


显而易见 sonatype/nexus3 是首选

docker pull sonatype/nexus3

是的一个强大的私有库,只需等待这条命令执行完成就可以了。具体如何配 nexus 这里就不做详细介绍了,无论是 Google 还是百度都一大把。


webp

Nexus仓库截图

支持 Kotlin aar 打包,包括 java 文档打包。

要想支持 Kotlin 打包,需要使用 Kotlin 官方插件 org.jetbrains.dokka:dokka-android-gradle-plugin,目前最新版本是 0.9.17,虽然还没到1.0,暂时没有发现问题。

//工程的 build.gradledependencies {
    ...    classpath "org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.17"
    ...
}repositories {
    ...
    maven {
        url "https://plugins.gradle.org/m2/"
    }
    ...
}
//库 Module 的 build.gradletask generateSourcesJar(type: Jar) {    group = 'jar'
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'}task javadoc(type: Javadoc) {    source = android.sourceSets.main.java.srcDirs    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
    outputFormat = "javadoc"
    outputDirectory = javadoc.destinationDir}task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) {    group = 'jar'
    classifier = 'javadoc'
    from javadoc.destinationDir}artifacts {    //在频繁打包交付测试时,可暂时注释掉文档打包,提高打包效率
    archives generateJavadoc

    archives generateSourcesJar
}//动态获取版本名称def POM_VERSION_NAME = getVersionName()

uploadArchives {    repositories {
        mavenDeployer {
            snapshotRepository(url: NEXUS_REPO_SNAPSHOT_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            repository(url: NEXUS_REPO_RELEASE_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            pom.project {
                name POM_NAME
                version POM_VERSION_NAME
                artifactId POM_ARTIFACTID
                groupId POM_GROUP_ID
                packaging POM_PACKAGING                description POM_DESCRIPTION
            }
        }
    }
}def getVersionCode() {    def versionFile = file('./version.properties')    if (versionFile.canRead()) {
        Properties properties = new Properties()
        properties.load(new FileInputStream(versionFile))        def versionCode = properties['VERSION_CODE'].toInteger()//读取version.properties文件存放的版本号。
        properties['VERSION_CODE'] = (++versionCode).toString()
        properties.store(versionFile.newWriter(), null)        return versionCode
    } else {        throw new Exception("无法读取version.properties文件!")
    }
}//频繁测试发布时配置自动追加 -SNAPSHOT 后缀def getVersionName() {    def versionFile = file('./version.properties')    if (versionFile.canRead()) {
        Properties properties = new Properties()
        properties.load(new FileInputStream(versionFile))        //这里可以根据 gradle.startParameter.taskNames 任务名称进行判断是打包快照版本还是正式版本
        return properties['VERSION_NAME'].toString() + "." + getVersionCode() + "-SNAPSHOT"
    } else {        throw new Exception("无法读取version.properties文件!")
    }
}

SNAPSHOT上传 版本号必须以SNAPSHOT结尾

通过上面的配置已经可以实现打包上传了。由于我的部分模块功能还处于开发阶段,就想着每次编译自动打包上传到Nexus私有仓库。显然这样频繁的上传不适用于release的仓库,应该上传至SNAPSHOT。可尝试了多种方法仍旧不能上传到SNAPSHOT,知道看到一个 官方例子
我尝试着将版本号追加SNAPSHOT后缀,然后就神奇的可以了。上面的库 Module 的 build.gradle 已经包含了这个设置。

持续打包,持续测试

原本以为这样就天高任鸟飞了,但实践时发现不是这样的。频繁发布时需要不停的修改打包以及集成的版本,真心累。Google了半天大部分的答案是做如下配置:

//在主 Module 的 build.gradle 配置configurations.all {    // check for updates every build
    resolutionStrategy{
        cacheDynamicVersionsFor 0, 'seconds'
    }
}

我做了上述配置还是不会自动更新。于是便另觅它法,自动升级库版本号,而主 Module 自动使用最新的版本。同样上面的库的 build.gradle 已经做了版本自增长逻辑,还需要在库 Module 根目录下增加一个 version.properties 文件,每次回追加一个自增长的数字(0.0.1 0.0.2 0.0.3 .... 0.0.n)。当做大的升级时,修改下 VERSION_NAME 并重置 VERSION_CODE=0 即可。

#Thu Jan 17 18:53:14 CST 2019VERSION_NAME=0.0
VERSION_CODE=0

集成私有库

要想使用私有的库,需要做如下配置:
配置私有的 Nexus 仓库地址,包括 release 仓库,snapshots 仓库。

//工程的 build.gradlemaven {
    url "http://<nexus server>:port/repository/xxxx-releases/"}
maven {
    url "http://<nexus server>:port/repository/xxxx-snapshots/"}

在应用打包的仓库时,如果想每次获取最新的库,需要设置一个动态的版本,下面的两种形式都可以:

//主 Module 的 build.gradleimplementation '<group id>:<name>:latest.integration'// implementation '<group id>:<name>:0.0.+-SNAPSHOT'



作者:Jepack
链接:https://www.jianshu.com/p/8aba5768a20b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消