写作背景
最近由于疫情影响,公司业务也受影响节奏变慢,使得我有了时间后头整理以往项目中验证、应用过得一些技术总结。俗话所得好“好记性不如烂笔头”。下面进入正文吧。
问题描述
在之前开发中总存在这样的问题:一个项目由员工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}")
}
}
}
}