2015-05-29 69 views
3

目前我正在尝试通过自动递增版本码来改进我们的buildscript,以便我们的QA团队了解他们正在测试的构建版本,并可以针对特定的版本代码进行日志记录。我们有3个productFlavors(staging,qa,production)和2个签名配置(debug,release)。基于这些我已经建立了使用version.properties文件VERSIONCODE增量器答案仅在版本上自动增加版本号

How to autoincrement versionCode in Android Gradle

How to autoincrement versionCode in Android Gradle

Autoincrement VersionCode with gradle extra properties

我看着不同的解决方案。

现在问题出现了:对于每个productFlavor和SigningConfig组合(+ android studio中的gradle sync),都会生成一个新的版本代码。每当我点击播放按钮创建一个qaRelease构建时,我都希望版本码增加。因此,我们的buildcycle是:

  • 发展(永远不变的VERSIONCODE)
  • QUAL(更新VERSIONCODE)
  • 生产(永远不变的VERSIONCODE)

回答

4

你可以尝试类似的东西

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'以将版本代码增加到想要的任务。

+0

用'file(“build.gradle”)'你是指android manifest文件而不是build.gradle? –

+0

这取决于您何时设置您的版本代码。在build.gradle中定义它是一个很好的习惯,它会覆盖manifest文件。 –

+0

我编辑了我的答案。只需选择适合您的项目的解决方案;) –

7

我如何解决它:

  • 我在Android项目的根目录中创建一个文件version.properties,并在其中加入VERSIONCODE。

  • 然后我在我的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' 
    } 
} 

这样可以节省VERSIONCODE在一个单独的文件,所以我并不需要修改我的build.gradle这样。

+0

是否有什么特别的功能可以让您阅读您在项目文件夹根目录下创建的version.properties文件?我无法得到gradle来阅读这个文件。 – portfoliobuilder