Gradle脚本自动生成版本信息文件

写作背景

最近由于疫情影响,公司业务也受影响节奏变慢,使得我有了时间后头整理以往项目中验证、应用过得一些技术总结。俗话所得好“好记性不如烂笔头”。下面进入正文吧。

问题描述

在之前开发中总存在这样的问题:一个项目由员工A维护过一段时间,交给了员工B维护(还有可能过段时间又交给了员工C),员工B在维护发版时就不知道上个版本的版本号或者想要知道之前发过的版本都更新了那些东西,查询起来就显得很麻烦。

解决方法

最好的方法就是可以新建一个build.gradle文件,在文件中创建一个Task任务专门读取打包信息(版本号、版本名、版本信息等等你想记录的一切),然后将信息累加写入一个固定文件中。这样每次打包发版时,通过gradle执行下Task任务即可

操作步骤

  • 1、项目中新建一个build.gradle文件
  • 2、在文件中创建一个Task任务,具体实现见代码
  • 3、执行Task任务
import groovy.xml.MarkupBuilder

ext {
    /*versionName = rootProject.ext.android.versionName
    versionCode = rootProject.ext.android.versionCode*/
    versionName = '1.1.2'
    versionCode = 2
    versionInfo = 'App的第1个版本,上线了一些最基础核心的功能.'
    destFile = file('releasesinfo.xml')//指定输出文件
    if (destFile != null && !destFile.exists()) {
        destFile.createNewFile()
    }
}
//创建一个Task,并指定输入输出
task writeTask {
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    outputs.file this.destFile
    doLast {
        //将输入的内容写入到输出文件中去
        def data = inputs.getProperties()
        File file = outputs.getFiles().getSingleFile()
        def versionMsg = new VersionMsg(data)
        //将实体对象写入到xml文件中
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //没有内容
            xmlBuilder.releases {
                release {
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            //直接写入
            file.withWriter { writer -> writer.append(sw.toString())
            }
        } else {
            //已有其它版本内容
            xmlBuilder.release {
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            //插入到最后一行前面
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { line, index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append('\r\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}
//信息实体类
class VersionMsg {
    String versionCode
    String versionName
    String versionInfo
}
//通过输入输出来指定Task的执行顺序
task readTask {
    //指定输入文件为上一个task的输出
    inputs.file this.destFile
    doLast {
        //读取输入文件的内容并显示
        def file = inputs.files.singleFile
        println file.text
    }
}

task taskZ {
    dependsOn writeTask, readTask//通过依赖指定Task的执行顺序
    doLast {
        println '输入输出任务结束'
    }
}

//将文档复制到指定的文件中
task handleReleaseFile {
    def srcFile = file('releases.xml')
    def destDir = new File(this.buildDir, 'generated/release/')
    doLast {
        println '开始解析对应的xml文件...'
        destDir.mkdir()
        def releases = new XmlParser().parse(srcFile)
        releases.release.each { releaseNode ->
            //解析每个release结点的内容
            def name = releaseNode.versionName.text()
            def versionCode = releaseNode.versionCode.text()
            def versionInfo = releaseNode.versionInfo.text()
            //创建文件并写入结点数据
            def destFile = new File(destDir, "release-${name}.txt")
            destFile.withWriter { writer -> writer.write("${name} -> ${versionCode} -> ${versionInfo}")
            }
        }
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值