Files
urldb/utils/version.go
2025-08-20 17:16:34 +08:00

154 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 (
// 这些变量将在编译时通过 ldflags 注入
Version = "unknown" // 默认版本,编译时会被覆盖
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)
// 检查版本信息是否通过编译时注入
version := Version
gitCommit := GitCommit
gitBranch := GitBranch
// 如果编译时注入的版本是默认值,尝试从文件读取
if version == "unknown" {
version = getVersionFromFile()
}
// 如果Git信息是默认值尝试从文件读取
if gitCommit == "unknown" {
gitCommit = "unknown"
}
if gitBranch == "unknown" {
gitBranch = "unknown"
}
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, TimeFormatDateTime),
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
}