Hi. I have version string like “1.0.3” in gradle.properties file.
I want to have 3 tasks:
release - update version to 2.0.0 and create release apk releaseBeta - update version to 1.1.0 and create release apk releaseNightly - update version to 1.0.4 and create release apk
I’ve done it already for gradle 1.12 and plugin 0.12.+, but with gradle 2.2.1 and plugin 1.0 my solution doesn’t work (version of created apk is the old instead updated one)
My code is: VersionUtils is just helper java class to operate with version strings
import java.util.regex.Matcher
import java.util.regex.Pattern
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:1.0.0"
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.2.1'
}
ext {
deliveryDir = 'delivery'
appVersion = new Version(project: this, subprojects: subprojects, versionName: versionName)
}
subprojects {
repositories {
jcenter()
}
}
subprojects.each { subproject ->
subproject.configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
}
evaluationDependsOn(subproject.path)
}
subprojects.findAll { project -> project.hasProperty('android') && project.android.hasProperty('applicationVariants') }.each { project ->
def deliverToLocal = task("deliverToLocal_${project.name}") {
ext.outputDir = "${deliveryDir}/${project.name}"
description = "Deliver ${project.name} binaries to ${outputDir} folder"
dependsOn project.assembleRelease
doLast {
deliverBinariesFor project, outputDir
}
}
task("release_${project.name}", dependsOn: deliverToLocal) << {
description = "Release ${project.name} application"
}
}
task clearDeliveryDir << {
delete deliveryDir
delete 'build'
}
def deliverBinariesFor(def project, def outputDir) {
project.android.applicationVariants.all { variant ->
copy {
variant.outputs.each { output ->
from output.outputFile
}
from "${project.buildDir}/outputs/proguard/release/mapping.txt"
from "${project.buildDir}/outputs/lint-results-release-fatal.html"
into outputDir
}
copy {
from("${project.buildDir}/outputs") {
include 'lint-results*_files/*.css'
include 'lint-results*_files/*.png'
}
into "${outputDir}/lint-result-release-fatal"
}
}
}
task deliverToExternal(dependsOn: [tasks.findAll { task -> task.name.startsWith('release_') }]) << {}
//---------------release app---------------------------
task increaseMajorVersion << {
appVersion.increaseMajor()
}
task increaseBetaVersion << {
appVersion.increaseBeta()
}
task increaseNightlyVersion << {
appVersion.increaseNightly()
}
task saveVersion << {
appVersion.save()
}
clearDeliveryDir.mustRunAfter increaseMajorVersion
clearDeliveryDir.mustRunAfter increaseBetaVersion
clearDeliveryDir.mustRunAfter increaseNightlyVersion
deliverToExternal.mustRunAfter clearDeliveryDir
saveVersion.mustRunAfter deliverToExternal
task releaseMajor(dependsOn: [increaseMajorVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
description 'Release a new version of application, create tag and increase version'
doLast {
println "${appVersion} released"
}
}
task releaseBeta(dependsOn: [increaseBetaVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
description 'Release a new version of application, create tag and increase version'
doLast {
println "${appVersion} released"
}
}
task releaseNightly(dependsOn: [increaseNightlyVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
description 'Release a new version of application, create tag and increase version'
doLast {
println "${appVersion} released"
}
}
//-------------------Utils----------------
class Version {
def project
def subprojects
String versionName
boolean release
String toString() { return VersionUtils.toString(versionName) }
Version increaseMajor() { versionName = VersionUtils.increaseMajor(versionName); apply(); this }
Version increaseBeta() { versionName = VersionUtils.increaseBeta(versionName); apply(); this }
Version increaseNightly() { versionName = VersionUtils.increaseNightly(versionName); apply(); this }
void apply() {
subprojects.findAll { project -> project.hasProperty('android') && project.android.hasProperty('applicationVariants') }.each { project ->
project.android.defaultConfig.versionName = this.toString()
project.android.defaultConfig.versionCode = VersionUtils.makeVersionCode(this.toString(), project.android.defaultConfig.minSdkVersion.mApiLevel as int)
project.android.productFlavors.each { flavor ->
flavor.versionName = this.toString()
flavor.versionCode = VersionUtils.makeVersionCode(this.toString(), flavor.minSdkVersion.mApiLevel as int)
println "${flavor.name} versionName = ${flavor.versionName}, versionCode = ${flavor.versionCode}"
}
}
}
void save() {
project.ant.propertyfile(file: 'gradle.properties') {
entry(key: "versionName", value: versionName)
}
project.ant.replaceregexp(file: 'gradle.properties', match: /^#[^ ].*\s*/, replace: "", flags: "g")
}
}