2015-05-29 93 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