mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
154 lines
3.6 KiB
Go
154 lines
3.6 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 (
|
||
// 这些变量将在编译时通过 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
|
||
}
|