Skip to content

自动化版本号管理

从 Git Tag 读取版本

kotlin
// build.gradle.kts
fun getVersionFromGit(): String {
    return try {
        val process = ProcessBuilder("git", "describe", "--tags", "--always", "--dirty")
            .directory(rootProject.projectDir)
            .start()
        process.inputStream.bufferedReader().readText().trim()
    } catch (e: Exception) {
        "0.0.0-unknown"
    }
}

// 或者使用 Provider(懒加载,推荐)
val versionFromGit = providers.exec {
    commandLine("git", "describe", "--tags", "--always")
}.standardOutput.asText.map { it.trim() }

version = versionFromGit.orElse("0.0.0-SNAPSHOT").get()

使用 axion-release 插件

kotlin
plugins {
    id("pl.allegro.tech.build.axion-release") version "1.17.0"
}

scmVersion {
    tag {
        prefix.set("v")     // tag 格式:v1.0.0
    }
    
    versionCreator("versionWithBranch")  // 非主分支加入分支名
    branchVersionCreator.put("main", "default")
    branchVersionCreator.put("develop", "versionWithBranch")
}

// 从 SCM 读取版本
version = scmVersion.version
bash
# 查看当前版本
./gradlew currentVersion

# 发布(打 tag 并推送)
./gradlew release

# 只打 tag,不推送
./gradlew release -Prelease.dryRun

使用 nebula-release 插件

kotlin
plugins {
    id("nebula.release") version "19.0.2"
}
bash
# 发布候选版
./gradlew candidate

# 发布正式版
./gradlew final

# 发布快照版
./gradlew snapshot

版本文件管理

kotlin
// 从 version.properties 读取版本
val versionProps = Properties()
file("version.properties").inputStream().use { versionProps.load(it) }
version = "${versionProps["major"]}.${versionProps["minor"]}.${versionProps["patch"]}"

// 自动递增小版本
tasks.register("bumpVersion") {
    doLast {
        val patch = (versionProps["patch"] as String).toInt() + 1
        versionProps["patch"] = patch.toString()
        file("version.properties").writer().use { versionProps.store(it, null) }
        println("Version bumped to ${versionProps["major"]}.${versionProps["minor"]}.$patch")
    }
}

下一步