AndroidのversionCode, versionNameをインクリメントするGradleタスク
AndroidプロジェクトのversionCodeやversionNameは、だいたい1つずつインクリメントしていくだけの場合が多く、コマンド1発で書き換えられるようにしておけば、将来的にCIなどでこの辺の作業を自動化させる時にも楽だよね、というヤツです。
iOSプロジェクトだとfastlaneの increment_build_number や increment_version_number のActionで同様のことができますが、手元のAndroidプロジェクトだとfastlaneは使わずGradleでほとんどのビルドタスクを実行しているので、自前のGradleタスクとして用意しました。
Gradleタスク内容
versionCodeのインクリメント
[build.gradle]
task incrementVersionCode {
doFirst {
println("Incrementing Version Code...")
def pattern = "versionCode (\\d+)"
def manifestFile = file("./app/build.gradle")
def manifestText = manifestFile.getText()
def code = Integer.parseInt((manifestText =~ pattern)[0][1])
def nextCode = code + 1
// 番号直接指定の場合
if (project.hasProperty("num")) {
def num = project.property("num")
if (num != "" && num.isInteger()) {
nextCode = num
}
}
println("Set versionCode(" + code + ") to " + nextCode);
def manifestContent = manifestText.replaceAll(pattern, "versionCode " + nextCode)
manifestFile.write(manifestContent)
}
}
Usage
単純インクリメント
$ ./gradlew incrementVersionCode
minSdkVersion 23
targetSdkVersion 29
- versionCode 11
+ versionCode 12
versionName "1.3.0"
versionCode指定
$ ./gradlew incrementVersionCode -Pnum=50
minSdkVersion 23
targetSdkVersion 29
- versionCode 11
+ versionCode 50
versionName "1.3.0"
versionNameのインクリメント
[build.gradle]
task incrementVersionName {
doFirst {
println("Incrementing Version Name...")
def pattern = "versionName \"(\\d+)\\.(\\d+)\\.(\\d+)\""
def manifestFile = file("./app/build.gradle")
def manifestText = manifestFile.getText()
def versionNames = (manifestText =~ pattern)[0]
def major = Integer.parseInt(versionNames[1])
def minor = Integer.parseInt(versionNames[2])
def patch = Integer.parseInt(versionNames[3])
def nextVersionName = major + "." + minor + "." + (patch + 1) // Default
if (project.hasProperty("type")) {
def type = project.property("type")
if (type == "minor") {
nextVersionName = major + "." + (minor + 1) + ".0"
} else if (type == "major") {
nextVersionName = (major + 1) + ".0.0"
}
}
println("Set VersionName to " + nextVersionName);
def manifestContent = manifestText.replaceAll(pattern, "versionName \"" + nextVersionName + "\"")
manifestFile.write(manifestContent)
}
}
Usage
Patchバージョンインクリメント
$ ./gradlew incrementVersionName
minSdkVersion 23
targetSdkVersion 29
versionCode 11
- versionName "1.3.0"
+ versionName "1.3.1"
Minorバージョンインクリメント
$ ./gradlew incrementVersionName -Ptype=minor
minSdkVersion 23
targetSdkVersion 29
versionCode 11
- versionName "1.3.0"
+ versionName "1.4.0"
Majorバージョンインクリメント
$ ./gradlew incrementVersionName -Ptype=major
minSdkVersion 23
targetSdkVersion 29
versionCode 11
- versionName "1.3.0"
+ versionName "2.0.0"
おわりに
とりあえずタスクを動かすことが目的であんまりコードの書き方にこだわって無いので、コード自体はもうちょっと整理できそうな気がしますね。
ただ、今はちょっとGroovy言語仕様を調べるモチベーションになれてないので、まぁリファクタは追々...。