如何实现gradle代码版本自动增量?

时间:2016-02-15 11:20:33

标签: android gradle android-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运行的所有任务(它们的名称)?

4 个答案:

答案 0 :(得分:1)

我执行此问题:

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

version.properties

VERSION_CODE=45

并在android配置部分

 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;
}

答案 1 :(得分: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.")
    }

答案 2 :(得分:0)

我从googler Nick Butcher 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}"
}

答案 3 :(得分:-2)

git非常有用,请点击此链接: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")
    ...
    }
}