2016-02-15 41 views
5

更具体地说,我有几个构建CONFIGS:如何实现gradle代码版本自动递增?

signingConfigs { 
    debug { 
     keyAlias '' 
     keyPassword '' 
     storeFile file('') 
    } 
    release { 
     keyAlias '' 
     keyPassword '' 
     storeFile file('') 
     storePassword '' 
    } 
} 
.... 
defaultConfig { 
    applicationId "" 
    minSdkVersion 21 
    targetSdkVersion 23 
    versionCode code 
} 

我想gradle这个每一次“释放”运行时为自动增量代码版本。

我有什么至今:

def code = 1; 

//Get all the gradle task names being run 
List<String> runTasks = gradle.startParameter.getTaskNames(); 

for (String item : runTasks) { 

    //Get the version.properties file. Its our custom file for storing a code version, please don't remove it 
    def versionPropsFile = file('version.properties') 

    def Properties versionProps = new Properties() 

    //This will prevent the gradle from exploding when there's no file yet created 
    if (versionPropsFile.exists()) 
     versionProps.load(new FileInputStream(versionPropsFile)) 

    //It will insert the "0" version in case the file does not exist 
    code = (versionProps['VERSION_CODE'] ?: "0").toInteger() 

    if (item.contains("release")) { 
     // If we're building up on Jenkins, increment the version strings 
     code++ 

     versionProps['VERSION_CODE'] = code.toString() 

     //It will overwrite the file even if it doesn't exist 
     versionProps.store(versionPropsFile.newWriter(), null) 
    } 
} 

问题:

我似乎无法进去if (item.contains("release"))。它总是虚假的,但我绝对可以看到Gradle运行这个taks。我怎样才能解决它或至少在控制台输出由gradle运行的所有任务(他们的名字)?

+1

这是一个重复http://stackoverflow.com/questions/23516090/android-studio-gradle-version-increment?rq=1? – k3b

+0

@ k3b感谢您指出这一点。在这篇文章中接受的解决方案不适合我。让我再检查一次。 –

回答

-2

混帐能有所帮助,请点击此链接:Automatic versioning and increment using Git tags and Gradle

android { 
    defaultConfig { 
    ... 
     // Fetch the version according to git latest tag and "how far are we from last tag" 
     def longVersionName = "git -C ${rootDir} describe --tags --long".execute().text.trim() 
     def (fullVersionTag, versionBuild, gitSha) = longVersionName.tokenize('-') 
     def(versionMajor, versionMinor, versionPatch) = fullVersionTag.tokenize('.') 

     // Set the version name 
     versionName "$versionMajor.$versionMinor.$versionPatch($versionBuild)" 

     // Turn the version name into a version code 
     versionCode versionMajor.toInteger() * 100000 + 
       versionMinor.toInteger() * 10000 + 
       versionPatch.toInteger() * 1000 + 
       versionBuild.toInteger() 

     // Friendly print the version output to the Gradle console 
     printf("\n--------" + "VERSION DATA--------" + "\n" + "- CODE: " + versionCode + "\n" + 
       "- NAME: " + versionName + "\n----------------------------\n") 
    ... 
    } 
} 
+0

而不是张贴链接,发布在这里的实际内容。链接可能会下降。链接应仅用于参考。 – Mangesh

0

试试这个。我在我的所有应用程序中都使用它,并且工作正常。首先,在/ app /文件夹中创建一个version.properties文件。该文件应该如下所示。 此处VERSION_CODE表示您的应用中的versionCode字段。当VERSION_NAME在您的版本名称中指示次要补丁时,这应该始终增加。 (例如x.x.12)。

/app/version.properties

VERSION_NAME=0  
VERSION_CODE=0 

然后在你的模块级,的build.gradle文件中defaultConfig块添加以下代码。这会在每次发布版本后将版本代码和版本名称增加1。 (基本上,当assambleRelease gradle这个任务的执行。如果您按照您的要求有不同的生成类型更改任务名称。)

/app/build.gradle

//Version code increment 
    def versionPropsFile = file('version.properties') 
    if (versionPropsFile.canRead()) { 
     //load the version.properties file 
     def Properties versionProps = new Properties() 
     versionProps.load(new FileInputStream(versionPropsFile)) 

     /** 
     * get the name of currently running task 
     */ 
     def runTasks = gradle.startParameter.taskNames 

     /** 
     * Value to increment in minor version & version code. 
     */ 
     def incrementCount = 0 

     //Build version code and build type logic. 
     if (':storeFinder:assembleRelease' in runTasks) { 

      //if it is Production build package increment the version code by 1. 
      incrementCount = 1; 
     } 

     //generate new version code 
     def code = versionProps['VERSION_CODE'].toInteger() + incrementCount 
     def minorPatch = versionProps['VERSION_NAME'].toInteger() + incrementCount 

     //write new versionCode/version name suffix back to version.properties 
     versionProps['VERSION_CODE'] = code.toString() 
     versionProps['VERSION_NAME'] = minorPatch.toString() 
     versionProps.store(versionPropsFile.newWriter(), null) 

     //here version code is decided by above code. 
     //noinspection GroovyAssignabilityCheck 
     versionCode code 
     versionName "1.0." + minorPatch; //e.g. 1.0.61 

    } else { 
     //version.properties file not found. 
     throw new GradleException("Could not read version.properties! Copy that to /app folder from version control.") 
    } 
1

我实现这个问题的:

我有一个版本的文件,其中包含版本号。从这个文件我们得到的版本。当构建包含任务“publishRelease”(它可以是任何其他任务)时,我们增加版本文件中的版本。 我喜欢这种溶剂,因为它保持了编码逻辑的defaultConfig清洁。

的version.properties

VERSION_CODE=45 

,并在机器人的配置部分

defaultConfig { 
    applicationId "..." 
    minSdkVersion 16 
    targetSdkVersion 23 
    versionCode getVersion() 
    versionName "0.2." + versionCode 
} 

和getVersion()

def getVersion() { 
    def versionPropertiesFile = file('version.properties') 
    def appVersion = -1; 

    if (versionPropertiesFile.canRead()) { 
     def Properties versionProps = new Properties() 

     versionProps.load(new FileInputStream(versionPropertiesFile)) 

     appVersion = versionProps['VERSION_CODE'].toInteger() 

     def runTasks = gradle.startParameter.taskNames 
     if ('publishRelease' in runTasks) { 
      print("Increase version to " + appVersion + '\n') 

      appVersion += 1 

      versionProps['VERSION_CODE'] = appVersion.toString() 
      versionProps.store(versionPropertiesFile.newWriter(), null) 
     } 

    } else { 
     throw new GradleException("Could not read version.properties!") 
    } 

    return appVersion; 
} 
0

采取以下从Google员工Plaid应用代码尼克布彻它真的很干净。

apply plugin: 'com.android.application' 

// query git for the SHA, Tag and commit count. Use these to automate versioning. 
def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim() 
def gitTag = 'git describe --tags'.execute([], project.rootDir).text.trim() 
def gitCommitCount = 100 + Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim()) 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId 'net.hadifar.dope' 
     minSdkVersion 14 
     targetSdkVersion 23 
     versionName gitTag 
     versionCode gitCommitCount 
     buildConfigField "String", "GIT_SHA", "\"${gitSha}\"" 

    } 

    lintOptions { 
     abortOnError false 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    productFlavors {} 
} 
ext { 
    supportLibVersion = '23.3.0' 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 

    compile "com.android.support:appcompat-v7:${supportLibVersion}" 
} 
+0

此代码不会通过每个发行版本增加版本。它随着每次提交而增加。但您可以修改以适应您的需求。 – Amir