这就是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/main/AndroidManifest.xml
<manifest package="com.example" />
自动版本.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 目录中生成的文件,看看这些值是否符合您的喜好。
手动执行(来自 cmets)
您可能有多种风格,在这种情况下版本会多次递增,因为多个变体与发布构建类型匹配。最初的问题是没有味道。如果您想在版本号增加时拥有更多控制权,只需删除 afterEvaluate 块并随时调用 incrementVersion 任务:
gradle incrementVersion assembleFreeRelease assemblePaidRelease
(上述手动执行是一个未经验证的想法。)
检查未提交的更改
此答案未涵盖“检查未提交的更改”,这是另一个游戏。如果我理解正确,您可以联系tasks.preBuild.doFirst { /*fail here if uncommited changes*/ }。但这在很大程度上取决于您的版本控制。询问其他问题以获得更多信息!