Как я могу реализовать автоматическую инкрементную версию версии кода?

Более конкретно, у меня есть несколько конфигураций сборки:

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

Я хочу, чтобы gradle автоматически обновлял версию кода каждый раз, когда запускается «release».

Что я до сих пор:

 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")) . Это всегда ложно, но я определенно вижу, что эта град управляет этим taks. Как я могу исправить это или, по крайней мере, вывести на консоль все задачи (их имена), управляемые градиентом?

Попробуй это. Я использую это во всем моем приложении и отлично работает. Сначала создайте файл version.properties в папке / app /. Этот файл должен выглядеть следующим образом. Здесь VERSION_CODE указывает поле versionCode в вашем приложении. Это должно постоянно увеличиваться, пока VERSION_NAME указывает на незначительный патч в вашем имени версии. (Egxx12).

/app/version.properties

 VERSION_NAME=0 VERSION_CODE=0 

Затем на вашем уровне модуля build.Gradle добавьте следующий код в блок по умолчаниюConfig. Это увеличит код версии и имя версии на 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; //eg 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.") } 

Мое выполнение этой проблемы:

У меня есть файл версии, который содержит номер версии. Из этого файла мы получаем версию. Когда сборка содержит задачу «publishRelease» (это может быть любая другая задача), мы увеличиваем версию в файле версии. Мне нравится это решение, потому что он сохраняет чистоту по умолчаниюConfig от логики кодирования.

Версия.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; } 

Я принимаю следующий код от приложения Plaid от googler Nick Butcher. Это действительно чисто.

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

Git может помочь, следуйте по этой ссылке: Автоматическое управление версиями и приращение с использованием тегов Git и 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") ... } }