25. 04. 2018
Nebaví tě ručně zvyšovat verzi aplikace při každém vydání nové verze? V tomto článku si ukážeme jak nastavit verzi pomocí GIT tagu. Dává to perfektní smysl, každou verzi si totiž stejně chceme otagovat, tak proč rovnou nevyužít tag i pro definování verze.
Otagování verze v GITu
Napřed si definujme standardizované jméno tagu, které budeme dále používat:
{stage}/{x}.{y}.{z}
kde {stage} je něco jako alpha, beta, release a {x}, {y}, {z} čísla major, minor a build verze. Vytvořme si testovací GIT tag zavoláním:
git tag release/0.2.1 -a
Poslední commit jsme si tím otagovali jako release s verzí 0.2.1, pokud si chcete přečíst jaký tag jste to vytvořili, zavolejme:
git describe --match 'release/*' --long
Máme vyřešený GIT, pojďme na Gradle!
Přečtení verze v Gradle
Pomocí příkazové příkazové řádky si přečteme poslední tag vytvořený pro konkrétní build variantu, jak bylo zmíněno výše. Výsledkem je jednoduchá funkce pro čtení a parsování verze z GIT tagu:
def getVersionTag = { variant ->
def stdout
try {
stdout = new ByteArrayOutputStream()
exec {
commandLine "git", "describe", "--match", "${variant}/*", "--long"
standardOutput = stdout
}
def longTag = stdout.toString().trim()
return longTag.substring(longTag.indexOf('/') + 1, longTag.indexOf('-'))
} catch (exception) {
return "0.0.1";
}
}
Na výstupu z této metody bude pro náš testovací tag „0.2.1“, tedy verze bez build variant prefixu. Tím máme v podstatě hotový version name, ještě potřebujeme version code:
def getVersionCode = { tag ->
def parts = tag.tokenize('.')
if(parts.size() != 3 || parts[1].length() > 2 || parts[2].length() > 2) {
throw new RuntimeException("Invalid version tag \"${tag}\", format \"x.y.z\" expected.")
}
if(parts[1].length() == 1) {
parts[1] = "0" + parts[1]
}
if(parts[2].length() == 1) {
parts[2] = "0" + parts[2]
}
return Integer.parseInt(parts[0] + parts[1] + parts[2])
}
def getVersionName = { tag ->
return tag
}
Použití verze z GITu ve všech build variantách
Nakonec aplikujeme version name a code na všechny build varianty. Následující kus scriptu, přidaný na konec android sekce, nám to zařídí:
android {
applicationVariants.all { variant ->
def versionTag = getVersionTag(variant.buildType.name)
def myVersionCode = getVersionCode(versionTag)
def myVersionName = getVersionName(versionTag)
println variant.name + "[" + myVersionCode + ", " + myVersionName + "]"
variant.mergedFlavor.versionName = myVersionName;
variant.mergedFlavor.versionCode = myVersionCode;
}
}
Celý build.gradle script
Máme hotovo, takto nějak může vypadat kompletní Gradle script:
apply plugin: 'com.android.application'
def getVersionTag = { variant ->
def stdout
try {
stdout = new ByteArrayOutputStream()
exec {
commandLine "git", "describe", "--match", "${variant}/*", "--long"
standardOutput = stdout
}
def longTag = stdout.toString().trim()
return longTag.substring(longTag.indexOf('/') + 1, longTag.indexOf('-'))
} catch (exception) {
return "0.0.1";
}
}
def getVersionCode = { tag ->
def parts = tag.tokenize('.')
if(parts.size() != 3 || parts[1].length() > 2 || parts[2].length() > 2) {
throw new RuntimeException("Invalid version tag \"${tag}\", format \"x.y.z\" expected.")
}
if(parts[1].length() == 1) {
parts[1] = "0" + parts[1]
}
if(parts[2].length() == 1) {
parts[2] = "0" + parts[2]
}
return Integer.parseInt(parts[0] + parts[1] + parts[2])
}
def getVersionName = { tag ->
return tag
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "net.skoumal.gittagversion"
minSdkVersion 14
targetSdkVersion 22
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
applicationVariants.all { variant ->
def versionTag = getVersionTag(variant.buildType.name)
def myVersionCode = getVersionCode(versionTag)
def myVersionName = getVersionName(versionTag)
println variant.name + "[" + myVersionCode + ", " + myVersionName + "]"
variant.mergedFlavor.versionName = myVersionName;
variant.mergedFlavor.versionCode = myVersionCode;
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
}