Go语言学习: semver
go关于版本号的相关知识
安装
go get golang.org/x/mod/semver
main.go
下面的代码,表示增加 patch 的逻辑
package main
import (
"fmt"
"log"
"strconv"
"strings"
"golang.org/x/mod/semver"
)
func main() {
currentVersion := "v1.2.3"
if !semver.IsValid(currentVersion) {
log.Fatalf("无效的版本号: %s", currentVersion)
}
version := currentVersion[1:]
parts := strings.Split(version, ".")
if len(parts) != 3 {
log.Fatalf("版本号格式错误: %s", currentVersion)
}
patch, err := strconv.ParseInt(parts[2], 10, 32)
if err != nil {
log.Fatalf("转换 PATCH 部分出错: %v", err)
}
patch++
newVersion := fmt.Sprintf("v%s.%s.%d", parts[0], parts[1], patch)
fmt.Println("新版本号:", newVersion)
}
更实用的工具
promot: 我想实现一个方法,可以根据传入的
MAJOR/MINOR/PATCH
字符串,来更新版本号,返回新的版本号
package main
import (
"fmt"
"log"
"strconv"
"strings"
"golang.org/x/mod/semver"
)
// IncrementVersion 根据传入的 part (MAJOR, MINOR, PATCH) 更新相应版本号
func IncrementVersion(currentVersion, part string) (string, error) {
// 检查版本号是否有效
if !semver.IsValid(currentVersion) {
return "", fmt.Errorf("无效的版本号: %s", currentVersion)
}
// 去掉前缀 "v"
version := currentVersion[1:]
parts := strings.Split(version, ".")
if len(parts) != 3 {
return "", fmt.Errorf("版本号格式错误: %s", currentVersion)
}
// 解析 MAJOR, MINOR, PATCH 为整数
major, err := strconv.Atoi(parts[0])
if err != nil {
return "", fmt.Errorf("转换 MAJOR 部分出错: %v", err)
}
minor, err := strconv.Atoi(parts[1])
if err != nil {
return "", fmt.Errorf("转换 MINOR 部分出错: %v", err)
}
patch, err := strconv.Atoi(parts[2])
if err != nil {
return "", fmt.Errorf("转换 PATCH 部分出错: %v", err)
}
// 根据传入的 part 值递增对应部分
switch strings.ToUpper(part) {
case "MAJOR":
major++
minor = 0
patch = 0
case "MINOR":
minor++
patch = 0
case "PATCH":
patch++
default:
return "", fmt.Errorf("无效的版本部分: %s", part)
}
// 构造新的版本号
newVersion := fmt.Sprintf("v%d.%d.%d", major, minor, patch)
return newVersion, nil
}
func main() {
// 测试更新不同的部分
version, err := IncrementVersion("v1.2.3", "PATCH")
if err != nil {
log.Fatalf("更新版本出错: %v", err)
}
fmt.Println("更新 PATCH:", version) // 输出 v1.2.4
version, err = IncrementVersion("v1.2.3", "MINOR")
if err != nil {
log.Fatalf("更新版本出错: %v", err)
}
fmt.Println("更新 MINOR:", version) // 输出 v1.3.0
version, err = IncrementVersion("v1.2.3", "MAJOR")
if err != nil {
log.Fatalf("更新版本出错: %v", err)
}
fmt.Println("更新 MAJOR:", version) // 输出 v2.0.0
}