Files
urldb/utils/version.go
2025-07-29 14:00:01 +08:00

135 lines
3.1 KiB
Go

package utils
import (
"encoding/json"
"fmt"
"os"
"runtime"
"strings"
"time"
)
// VersionInfo 版本信息结构
type VersionInfo struct {
Version string `json:"version"`
BuildTime time.Time `json:"build_time"`
GitCommit string `json:"git_commit"`
GitBranch string `json:"git_branch"`
GoVersion string `json:"go_version"`
NodeVersion string `json:"node_version"`
Platform string `json:"platform"`
Arch string `json:"arch"`
}
// 编译时注入的版本信息
var (
Version = getVersionFromFile()
BuildTime = GetCurrentTimeString()
GitCommit = "unknown"
GitBranch = "unknown"
)
// getVersionFromFile 从VERSION文件读取版本号
func getVersionFromFile() string {
data, err := os.ReadFile("VERSION")
if err != nil {
return "1.0.0" // 默认版本
}
return strings.TrimSpace(string(data))
}
// GetVersionInfo 获取版本信息
func GetVersionInfo() *VersionInfo {
buildTime, _ := ParseTime(BuildTime)
return &VersionInfo{
Version: Version,
BuildTime: buildTime,
GitCommit: GitCommit,
GitBranch: GitBranch,
GoVersion: runtime.Version(),
NodeVersion: getNodeVersion(),
Platform: runtime.GOOS,
Arch: runtime.GOARCH,
}
}
// GetVersionString 获取版本字符串
func GetVersionString() string {
info := GetVersionInfo()
return fmt.Sprintf("v%s (%s)", info.Version, info.GitCommit)
}
// GetFullVersionInfo 获取完整版本信息
func GetFullVersionInfo() string {
info := GetVersionInfo()
return fmt.Sprintf(`版本信息:
版本号: v%s
构建时间: %s
Git提交: %s
Git分支: %s
Go版本: %s
Node版本: %s
平台: %s/%s`,
info.Version,
FormatTime(info.BuildTime, "2006-01-02 15:04:05"),
info.GitCommit,
info.GitBranch,
info.GoVersion,
info.NodeVersion,
info.Platform,
info.Arch,
)
}
// LoadVersionFromFile 从文件加载版本信息
func LoadVersionFromFile(filename string) (*VersionInfo, error) {
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
var info VersionInfo
err = json.Unmarshal(data, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// SaveVersionToFile 保存版本信息到文件
func SaveVersionToFile(filename string, info *VersionInfo) error {
data, err := json.MarshalIndent(info, "", " ")
if err != nil {
return err
}
return os.WriteFile(filename, data, 0644)
}
// getNodeVersion 获取Node.js版本
func getNodeVersion() string {
// 这里可以通过执行 node --version 来获取
// 为了简化,返回一个默认值
return "N/A"
}
// IsVersionNewer 比较版本号
func IsVersionNewer(version1, version2 string) bool {
// 简单的版本比较,可以根据需要实现更复杂的逻辑
return version1 > version2
}
// GetVersionComponents 获取版本号组件
func GetVersionComponents(version string) (major, minor, patch int, err error) {
var majorStr, minorStr, patchStr string
_, err = fmt.Sscanf(version, "%s.%s.%s", &majorStr, &minorStr, &patchStr)
if err != nil {
return 0, 0, 0, err
}
// 这里可以添加更复杂的版本号解析逻辑
return 1, 0, 0, nil
}