【问题标题】:Auto increment versioncode only on releases仅在发布时自动增加版本代码
【发布时间】:2015-05-29 07:14:13
【问题描述】:

目前,我正在尝试通过自动递增版本代码来改进我们的构建脚本,以便我们的 QA 团队了解他们正在测试的构建版本,并可以针对特定的版本代码进行记录。我们有 3 个 productFlavor(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(更新版本代码)
  • 生产(永远不要更改版本代码)

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    我是如何解决的:

    • 我在我的 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()
    }
    

    我还创建了一个生成新代码的方法:

    代码:

    // http://stackoverflow.com/questions/30523393/auto-increment-versioncode-only-on-releases
    //
    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。

    【讨论】:

    • 有什么特别的东西可以让 gradle 读取您在项目文件夹的根目录中创建的 version.properties 文件吗?我无法让 gradle 读取此文件。
    • 这不可能吗?
    【解决方案2】:

    你可以试试这样的

    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”以将版本代码递增到所需任务。

    【讨论】:

    • file("build.gradle") 是指 android manifest 文件而不是 build.gradle?
    • 这取决于您何时设置版本代码。在 build.gradle 中定义它是一种很好的做法,它会覆盖清单文件。
    • 我编辑了我的答案。只需选择适合您项目的解决方案;)
    • 我会接受你的答案,因为你让我走上了正确的道路。但我做了一些别的事情,我也会在解决方案中添加它:)
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2015-02-23
    • 2020-12-14
    • 2019-06-04
    • 2017-12-21
    • 2018-05-05
    • 2014-11-16
    相关资源
    最近更新 更多