仅在发布时自动增加版本代码
Auto increment versioncode only on releases
目前,我正在尝试通过自动递增版本代码来改进我们的构建脚本,以便我们的 QA 团队了解他们正在测试的构建版本,并可以针对特定版本代码进行记录。我们有 3 个 productFlavors(staging、qa、production)和 2 个签名配置(debug、release)。
我研究了不同的解决方案:
How to autoincrement versionCode in Android Gradle
How to autoincrement versionCode in Android Gradle
Autoincrement VersionCode with gradle extra properties
基于这些答案,我使用 version.properties 文件构建了一个版本代码增量器。
现在问题出现了,对于每个 productFlavor 和 SigningConfig 组合(+ android studio 中的 gradle 同步)都会生成一个新的版本代码。每当我点击播放按钮创建 qaRelease 版本时,我希望版本代码递增。所以我们的构建周期是:
- 开发(永远不要更改版本代码)
- qual(更新版本代码)
- 生产(永远不要更改版本代码)
你可以尝试类似的东西
import java.util.regex.Pattern
task('increaseVersionCode') << {
... // You could code in your increment system, for eg
// Using build.gradle (recommended)
def buildFile = file("build.gradle")
def pattern = Pattern.compile("versionCode\s+(\d+)")
def manifestText = buildFile.getText()
def matcher = pattern.matcher(manifestText)
matcher.find()
def versionCode = Integer.parseInt(matcher.group(1))
def manifestContent = matcher.replaceAll("versionCode " + ++versionCode)
buildFile.write(manifestContent)
// Using manifest
def manifestFile = file('AndroidManifest.xml')
def matcher = Pattern.compile('versionCode=\"(\d+)\"')
.matcher(manifestFile.getText())
matcher.find()
def manifestContent = matcher.replaceAll('versionCode=\"' +
++Integer.parseInt(matcher.group(1)) + '\"')
manifestFile.write(manifestContent)
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleQaRelease') {
task.dependsOn 'increaseVersionCode'
}
}
您可以调整 'assembleQaRelease' 以增加版本代码以完成所需的任务。
我是怎么解决的:
我在我的 android 项目的根目录中创建了一个文件 version.properties 并在其中添加了版本代码。
然后我在 build.gradle 文件中创建了名为 getCurrentVersionCode() 的方法来读取当前版本代码。
代码:
def getCurrentVersionCode() {
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
return versionProps['version_code'].toInteger()
}
我还创建了一个生成新代码的方法:
代码:
//
//
def setUpdatedVersionCode() {
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
def code = getCurrentVersionCode() + 1
versionProps['version_code'] = code.toString()
versionProps['version_name'] = generateVersionName()
versionProps.store(versionPropsFile.newWriter(), null)
}
然后我创建了一个在 QA 构建时触发的任务。
代码:
task('increaseVersionCode') << {
setUpdatedVersionCode()
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleQaRelease') {
task.dependsOn 'increaseVersionCode'
}
}
这样它将版本代码保存在一个单独的文件中,所以我不需要编辑我的 build.gradle。
目前,我正在尝试通过自动递增版本代码来改进我们的构建脚本,以便我们的 QA 团队了解他们正在测试的构建版本,并可以针对特定版本代码进行记录。我们有 3 个 productFlavors(staging、qa、production)和 2 个签名配置(debug、release)。
我研究了不同的解决方案:
How to autoincrement versionCode in Android Gradle
How to autoincrement versionCode in Android Gradle
Autoincrement VersionCode with gradle extra properties
基于这些答案,我使用 version.properties 文件构建了一个版本代码增量器。
现在问题出现了,对于每个 productFlavor 和 SigningConfig 组合(+ android studio 中的 gradle 同步)都会生成一个新的版本代码。每当我点击播放按钮创建 qaRelease 版本时,我希望版本代码递增。所以我们的构建周期是:
- 开发(永远不要更改版本代码)
- qual(更新版本代码)
- 生产(永远不要更改版本代码)
你可以尝试类似的东西
import java.util.regex.Pattern
task('increaseVersionCode') << {
... // You could code in your increment system, for eg
// Using build.gradle (recommended)
def buildFile = file("build.gradle")
def pattern = Pattern.compile("versionCode\s+(\d+)")
def manifestText = buildFile.getText()
def matcher = pattern.matcher(manifestText)
matcher.find()
def versionCode = Integer.parseInt(matcher.group(1))
def manifestContent = matcher.replaceAll("versionCode " + ++versionCode)
buildFile.write(manifestContent)
// Using manifest
def manifestFile = file('AndroidManifest.xml')
def matcher = Pattern.compile('versionCode=\"(\d+)\"')
.matcher(manifestFile.getText())
matcher.find()
def manifestContent = matcher.replaceAll('versionCode=\"' +
++Integer.parseInt(matcher.group(1)) + '\"')
manifestFile.write(manifestContent)
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleQaRelease') {
task.dependsOn 'increaseVersionCode'
}
}
您可以调整 'assembleQaRelease' 以增加版本代码以完成所需的任务。
我是怎么解决的:
我在我的 android 项目的根目录中创建了一个文件 version.properties 并在其中添加了版本代码。
然后我在 build.gradle 文件中创建了名为 getCurrentVersionCode() 的方法来读取当前版本代码。
代码:
def getCurrentVersionCode() {
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
return versionProps['version_code'].toInteger()
}
我还创建了一个生成新代码的方法:
代码:
//
//
def setUpdatedVersionCode() {
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
def code = getCurrentVersionCode() + 1
versionProps['version_code'] = code.toString()
versionProps['version_name'] = generateVersionName()
versionProps.store(versionPropsFile.newWriter(), null)
}
然后我创建了一个在 QA 构建时触发的任务。
代码:
task('increaseVersionCode') << {
setUpdatedVersionCode()
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleQaRelease') {
task.dependsOn 'increaseVersionCode'
}
}
这样它将版本代码保存在一个单独的文件中,所以我不需要编辑我的 build.gradle。