Ответ 1
Для чего предназначены buildTypes
. То, что вы описываете, это сборка release
, IMO.
Вот пример: при выполнении assembleDebug
он даст вам сборку моментальных снимков, а выполнение assembleRelease
даст вам чистую сборку без какого-либо суффикса и увеличенного номера версии. Следующая сборка отладки также будет использовать увеличивающийся номер.
Ниже приведена полная функциональная сборка, когда файлы создаются в папке. Он также должен работать с ароматами, но это только побочный продукт:). Gradle 2.2.1, Android-плагин 1.1.3
build.gradle
apply plugin: 'com.android.application'
apply from: 'auto-version.gradle'
buildscript {
repositories { jcenter() }
dependencies { classpath 'com.android.tools.build:gradle:1.1.3' }
}
android {
buildToolsVersion = "21.1.2"
compileSdkVersion = "android-21"
buildTypes {
debug {
versionNameSuffix "-SNAPSHOT"
}
}
}
println "config code: ${calculateVersionCode()}, name: ${calculateVersionName()}"
SRC/основные/AndroidManifest.xml
<manifest package="com.example" />
авто-version.gradle
ext {
versionFile = new File(project.rootDir, 'version.properties')
calculateVersionName = {
def version = readVersion()
return "${version['major']}.${version['minor']}.${version['build']}"
}
calculateVersionCode = {
def version = readVersion()
def major = version['major'] as int // 1..∞
def minor = version['minor'] as int // 0..99
def build = version['build'] as int // 0..999
return (major * 100 + minor) * 1000 + build
}
}
Properties readVersion() {
def version = new Properties()
def stream
try {
stream = new FileInputStream(versionFile)
version.load(stream)
} catch (FileNotFoundException ignore) {
} finally {
if (stream != null) stream.close()
}
// safety defaults in case file is missing
if(!version['major']) version['major'] = "1"
if(!version['minor']) version['minor'] = "0"
if(!version['build']) version['build'] = "0"
return version
}
void incrementVersionNumber() {
def version = readVersion()
// careful with the types, culprits: "9"++ = ":", "9" + 1 = "91"
def build = version['build'] as int
build++
version['build'] = build.toString()
def stream = new FileOutputStream(versionFile)
try {
version.store(stream, null)
} finally {
stream.close()
}
}
task incrementVersion {
description "Increments build counter in ${versionFile}"
doFirst {
incrementVersionNumber()
}
}
if (plugins.hasPlugin('android') || plugins.hasPlugin('android-library')) {
android {
defaultConfig {
versionName = calculateVersionName()
versionCode = calculateVersionCode()
}
afterEvaluate {
def autoIncrementVariant = { variant ->
if (variant.buildType.name == buildTypes.release.name) { // don't increment on debug builds
variant.preBuild.dependsOn incrementVersion
incrementVersion.doLast {
variant.mergedFlavor.versionName = calculateVersionName()
variant.mergedFlavor.versionCode = calculateVersionCode()
}
}
}
if (plugins.hasPlugin('android')) {
applicationVariants.all { variant -> autoIncrementVariant(variant) }
}
if (plugins.hasPlugin('android-library')) {
libraryVariants.all { variant -> autoIncrementVariant(variant) }
}
}
}
}
Выполняйте gradle assembleDebug
, чтобы нормально строить, gradle assembleRelease
, чтобы увеличивать и строить, и gradle incrementVersion
просто увеличивать.
Примечание: будьте осторожны с gradle assemble
, потому что порядок assembleDebug
и assembleRelease
даст разные результаты.
Проверьте сгенерированные файлы в каталоге build
, чтобы увидеть, соответствуют ли значения.
Ручное исполнение (из комментариев)
Возможно, у вас есть несколько вариантов, в этом случае версия увеличивается несколько раз, потому что несколько вариантов соответствуют типу выпуска. Первоначальный вопрос не вызывал никаких неприятностей. Если вы хотите получить больше контроля при увеличении номера версии, просто удалите блок afterEvaluate
и вызовите задачу incrementVersion
всякий раз, когда вы хотите:
gradle incrementVersion assembleFreeRelease assemblePaidRelease
(Вышеприведенное ручное выполнение является непроверенной идеей.)
Проверить незафиксированные изменения
"Проверить незафиксированные изменения" в этом ответе не рассматриваются, это другая игра. Если я правильно понял, вы можете подключиться к tasks.preBuild.doFirst { /*fail here if uncommited changes*/ }
. Но это сильно зависит от вашего контроля версий. Задайте еще один вопрос!