Go语言学习: semver

go关于版本号的相关知识
更新于: 2024-10-26 22:25:08

安装

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
}