feat(Go_Updater): 添加全新 Go 语言实现的自动更新器
- 新增多个源文件和目录,包括 app.rc、assets、build 脚本等 - 实现了与 MirrorChyan API 交互的客户端逻辑 - 添加了版本检查、更新检测和下载 URL 生成等功能 - 嵌入了配置模板和资源文件系统 - 提供了完整的构建和发布流程
This commit is contained in:
193
Go_Updater/version/manager.go
Normal file
193
Go_Updater/version/manager.go
Normal file
@@ -0,0 +1,193 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"lightweight-updater/logger"
|
||||
)
|
||||
|
||||
// VersionInfo represents the version information from version.json
|
||||
type VersionInfo struct {
|
||||
MainVersion string `json:"main_version"`
|
||||
VersionInfo map[string]map[string][]string `json:"version_info"`
|
||||
}
|
||||
|
||||
// ParsedVersion represents a parsed version with major, minor, patch, and beta components
|
||||
type ParsedVersion struct {
|
||||
Major int
|
||||
Minor int
|
||||
Patch int
|
||||
Beta int
|
||||
}
|
||||
|
||||
// VersionManager handles version-related operations
|
||||
type VersionManager struct {
|
||||
executableDir string
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
// NewVersionManager creates a new version manager
|
||||
func NewVersionManager() *VersionManager {
|
||||
execPath, _ := os.Executable()
|
||||
execDir := filepath.Dir(execPath)
|
||||
return &VersionManager{
|
||||
executableDir: execDir,
|
||||
logger: logger.GetDefaultLogger(),
|
||||
}
|
||||
}
|
||||
|
||||
// NewVersionManagerWithLogger creates a new version manager with a custom logger
|
||||
func NewVersionManagerWithLogger(customLogger logger.Logger) *VersionManager {
|
||||
execPath, _ := os.Executable()
|
||||
execDir := filepath.Dir(execPath)
|
||||
return &VersionManager{
|
||||
executableDir: execDir,
|
||||
logger: customLogger,
|
||||
}
|
||||
}
|
||||
|
||||
// createDefaultVersion creates a default version structure with v0.0.0
|
||||
func (vm *VersionManager) createDefaultVersion() *VersionInfo {
|
||||
return &VersionInfo{
|
||||
MainVersion: "0.0.0.0", // Corresponds to v0.0.0
|
||||
VersionInfo: make(map[string]map[string][]string),
|
||||
}
|
||||
}
|
||||
|
||||
// LoadVersionFromFile loads version information from resources/version.json with fallback handling
|
||||
func (vm *VersionManager) LoadVersionFromFile() (*VersionInfo, error) {
|
||||
versionPath := filepath.Join(vm.executableDir, "resources", "version.json")
|
||||
|
||||
data, err := os.ReadFile(versionPath)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
vm.logger.Info("Version file not found at %s, will use default version", versionPath)
|
||||
return vm.createDefaultVersion(), nil
|
||||
}
|
||||
vm.logger.Warn("Failed to read version file at %s: %v, will use default version", versionPath, err)
|
||||
return vm.createDefaultVersion(), nil
|
||||
}
|
||||
|
||||
var versionInfo VersionInfo
|
||||
if err := json.Unmarshal(data, &versionInfo); err != nil {
|
||||
vm.logger.Warn("Failed to parse version file at %s: %v, will use default version", versionPath, err)
|
||||
return vm.createDefaultVersion(), nil
|
||||
}
|
||||
|
||||
vm.logger.Debug("Successfully loaded version information from %s", versionPath)
|
||||
return &versionInfo, nil
|
||||
}
|
||||
|
||||
// LoadVersionWithDefault loads version information with guaranteed fallback to default
|
||||
func (vm *VersionManager) LoadVersionWithDefault() *VersionInfo {
|
||||
versionInfo, err := vm.LoadVersionFromFile()
|
||||
if err != nil {
|
||||
// This should not happen with the updated LoadVersionFromFile, but adding as extra safety
|
||||
vm.logger.Error("Unexpected error loading version file: %v, using default version", err)
|
||||
return vm.createDefaultVersion()
|
||||
}
|
||||
|
||||
// Validate that we have a valid version structure
|
||||
if versionInfo == nil {
|
||||
vm.logger.Warn("Version info is nil, using default version")
|
||||
return vm.createDefaultVersion()
|
||||
}
|
||||
|
||||
if versionInfo.MainVersion == "" {
|
||||
vm.logger.Warn("Version info has empty main version, using default version")
|
||||
return vm.createDefaultVersion()
|
||||
}
|
||||
|
||||
if versionInfo.VersionInfo == nil {
|
||||
vm.logger.Debug("Version info map is nil, initializing empty map")
|
||||
versionInfo.VersionInfo = make(map[string]map[string][]string)
|
||||
}
|
||||
|
||||
return versionInfo
|
||||
}
|
||||
|
||||
// ParseVersion parses a version string like "4.4.1.3" into components
|
||||
func ParseVersion(versionStr string) (*ParsedVersion, error) {
|
||||
parts := strings.Split(versionStr, ".")
|
||||
if len(parts) < 3 || len(parts) > 4 {
|
||||
return nil, fmt.Errorf("invalid version format: %s", versionStr)
|
||||
}
|
||||
|
||||
major, err := strconv.Atoi(parts[0])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid major version: %s", parts[0])
|
||||
}
|
||||
|
||||
minor, err := strconv.Atoi(parts[1])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid minor version: %s", parts[1])
|
||||
}
|
||||
|
||||
patch, err := strconv.Atoi(parts[2])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid patch version: %s", parts[2])
|
||||
}
|
||||
|
||||
beta := 0
|
||||
if len(parts) == 4 {
|
||||
beta, err = strconv.Atoi(parts[3])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid beta version: %s", parts[3])
|
||||
}
|
||||
}
|
||||
|
||||
return &ParsedVersion{
|
||||
Major: major,
|
||||
Minor: minor,
|
||||
Patch: patch,
|
||||
Beta: beta,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// ToVersionString converts a ParsedVersion back to version string format
|
||||
func (pv *ParsedVersion) ToVersionString() string {
|
||||
if pv.Beta == 0 {
|
||||
return fmt.Sprintf("%d.%d.%d.0", pv.Major, pv.Minor, pv.Patch)
|
||||
}
|
||||
return fmt.Sprintf("%d.%d.%d.%d", pv.Major, pv.Minor, pv.Patch, pv.Beta)
|
||||
}
|
||||
|
||||
// ToDisplayVersion converts version to display format (v4.4.0 or v4.4.1-beta3)
|
||||
func (pv *ParsedVersion) ToDisplayVersion() string {
|
||||
if pv.Beta == 0 {
|
||||
return fmt.Sprintf("v%d.%d.%d", pv.Major, pv.Minor, pv.Patch)
|
||||
}
|
||||
return fmt.Sprintf("v%d.%d.%d-beta%d", pv.Major, pv.Minor, pv.Patch, pv.Beta)
|
||||
}
|
||||
|
||||
// GetChannel returns the channel (stable or beta) based on version
|
||||
func (pv *ParsedVersion) GetChannel() string {
|
||||
if pv.Beta == 0 {
|
||||
return "stable"
|
||||
}
|
||||
return "beta"
|
||||
}
|
||||
|
||||
// GetDefaultChannel returns the default channel
|
||||
func GetDefaultChannel() string {
|
||||
return "stable"
|
||||
}
|
||||
|
||||
// IsNewer checks if this version is newer than the other version
|
||||
func (pv *ParsedVersion) IsNewer(other *ParsedVersion) bool {
|
||||
if pv.Major != other.Major {
|
||||
return pv.Major > other.Major
|
||||
}
|
||||
if pv.Minor != other.Minor {
|
||||
return pv.Minor > other.Minor
|
||||
}
|
||||
if pv.Patch != other.Patch {
|
||||
return pv.Patch > other.Patch
|
||||
}
|
||||
return pv.Beta > other.Beta
|
||||
}
|
||||
366
Go_Updater/version/manager_test.go
Normal file
366
Go_Updater/version/manager_test.go
Normal file
@@ -0,0 +1,366 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseVersion(t *testing.T) {
|
||||
tests := []struct {
|
||||
input string
|
||||
expected *ParsedVersion
|
||||
hasError bool
|
||||
}{
|
||||
{"4.4.0.0", &ParsedVersion{4, 4, 0, 0}, false},
|
||||
{"4.4.1.3", &ParsedVersion{4, 4, 1, 3}, false},
|
||||
{"1.2.3", &ParsedVersion{1, 2, 3, 0}, false},
|
||||
{"invalid", nil, true},
|
||||
{"1.2", nil, true},
|
||||
{"1.2.3.4.5", nil, true},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
result, err := ParseVersion(test.input)
|
||||
|
||||
if test.hasError {
|
||||
if err == nil {
|
||||
t.Errorf("Expected error for input %s, but got none", test.input)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Unexpected error for input %s: %v", test.input, err)
|
||||
continue
|
||||
}
|
||||
|
||||
if result.Major != test.expected.Major ||
|
||||
result.Minor != test.expected.Minor ||
|
||||
result.Patch != test.expected.Patch ||
|
||||
result.Beta != test.expected.Beta {
|
||||
t.Errorf("For input %s, expected %+v, got %+v", test.input, test.expected, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestToDisplayVersion(t *testing.T) {
|
||||
tests := []struct {
|
||||
version *ParsedVersion
|
||||
expected string
|
||||
}{
|
||||
{&ParsedVersion{4, 4, 0, 0}, "v4.4.0"},
|
||||
{&ParsedVersion{4, 4, 1, 3}, "v4.4.1-beta3"},
|
||||
{&ParsedVersion{1, 2, 3, 0}, "v1.2.3"},
|
||||
{&ParsedVersion{1, 2, 3, 5}, "v1.2.3-beta5"},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
result := test.version.ToDisplayVersion()
|
||||
if result != test.expected {
|
||||
t.Errorf("For version %+v, expected %s, got %s", test.version, test.expected, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetChannel(t *testing.T) {
|
||||
tests := []struct {
|
||||
version *ParsedVersion
|
||||
expected string
|
||||
}{
|
||||
{&ParsedVersion{4, 4, 0, 0}, "stable"},
|
||||
{&ParsedVersion{4, 4, 1, 3}, "beta"},
|
||||
{&ParsedVersion{1, 2, 3, 0}, "stable"},
|
||||
{&ParsedVersion{1, 2, 3, 1}, "beta"},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
result := test.version.GetChannel()
|
||||
if result != test.expected {
|
||||
t.Errorf("For version %+v, expected channel %s, got %s", test.version, test.expected, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsNewer(t *testing.T) {
|
||||
tests := []struct {
|
||||
v1 *ParsedVersion
|
||||
v2 *ParsedVersion
|
||||
expected bool
|
||||
}{
|
||||
{&ParsedVersion{4, 4, 1, 0}, &ParsedVersion{4, 4, 0, 0}, true},
|
||||
{&ParsedVersion{4, 4, 0, 0}, &ParsedVersion{4, 4, 1, 0}, false},
|
||||
{&ParsedVersion{4, 4, 1, 3}, &ParsedVersion{4, 4, 1, 2}, true},
|
||||
{&ParsedVersion{4, 4, 1, 2}, &ParsedVersion{4, 4, 1, 3}, false},
|
||||
{&ParsedVersion{4, 4, 1, 0}, &ParsedVersion{4, 4, 1, 0}, false},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
result := test.v1.IsNewer(test.v2)
|
||||
if result != test.expected {
|
||||
t.Errorf("For %+v.IsNewer(%+v), expected %t, got %t", test.v1, test.v2, test.expected, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionFromFile(t *testing.T) {
|
||||
// Create a temporary directory
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create resources directory
|
||||
resourcesDir := filepath.Join(tempDir, "resources")
|
||||
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create test version file
|
||||
versionData := VersionInfo{
|
||||
MainVersion: "4.4.1.3",
|
||||
VersionInfo: map[string]map[string][]string{
|
||||
"4.4.1.3": {
|
||||
"修复BUG": {"移除崩溃弹窗机制"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
data, err := json.Marshal(versionData)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
versionFile := filepath.Join(resourcesDir, "version.json")
|
||||
if err := os.WriteFile(versionFile, data, 0644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create version manager with custom executable directory and logger
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version
|
||||
result, err := vm.LoadVersionFromFile()
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to load version: %v", err)
|
||||
}
|
||||
|
||||
if result.MainVersion != "4.4.1.3" {
|
||||
t.Errorf("Expected main version 4.4.1.3, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if len(result.VersionInfo) != 1 {
|
||||
t.Errorf("Expected 1 version info entry, got %d", len(result.VersionInfo))
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionFromFileNotFound(t *testing.T) {
|
||||
// Create a temporary directory without version file
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create version manager with custom executable directory and logger
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version (should now return default version instead of error)
|
||||
result, err := vm.LoadVersionFromFile()
|
||||
if err != nil {
|
||||
t.Errorf("Expected no error with fallback mechanism, but got: %v", err)
|
||||
}
|
||||
|
||||
// Should return default version
|
||||
if result.MainVersion != "0.0.0.0" {
|
||||
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if result.VersionInfo == nil {
|
||||
t.Error("Expected initialized VersionInfo map, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionWithDefault(t *testing.T) {
|
||||
// Create a temporary directory
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create version manager with custom executable directory
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version with default (no file exists)
|
||||
result := vm.LoadVersionWithDefault()
|
||||
if result == nil {
|
||||
t.Fatal("Expected non-nil result from LoadVersionWithDefault")
|
||||
}
|
||||
|
||||
if result.MainVersion != "0.0.0.0" {
|
||||
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if result.VersionInfo == nil {
|
||||
t.Error("Expected initialized VersionInfo map, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionWithDefaultValidFile(t *testing.T) {
|
||||
// Create a temporary directory
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create resources directory
|
||||
resourcesDir := filepath.Join(tempDir, "resources")
|
||||
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create test version file
|
||||
versionData := VersionInfo{
|
||||
MainVersion: "4.4.1.3",
|
||||
VersionInfo: map[string]map[string][]string{
|
||||
"4.4.1.3": {
|
||||
"修复BUG": {"移除崩溃弹窗机制"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
data, err := json.Marshal(versionData)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
versionFile := filepath.Join(resourcesDir, "version.json")
|
||||
if err := os.WriteFile(versionFile, data, 0644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create version manager with custom executable directory
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version with default (valid file exists)
|
||||
result := vm.LoadVersionWithDefault()
|
||||
if result == nil {
|
||||
t.Fatal("Expected non-nil result from LoadVersionWithDefault")
|
||||
}
|
||||
|
||||
if result.MainVersion != "4.4.1.3" {
|
||||
t.Errorf("Expected version 4.4.1.3, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if len(result.VersionInfo) != 1 {
|
||||
t.Errorf("Expected 1 version info entry, got %d", len(result.VersionInfo))
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionFromFileCorrupted(t *testing.T) {
|
||||
// Create a temporary directory
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create resources directory
|
||||
resourcesDir := filepath.Join(tempDir, "resources")
|
||||
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create corrupted version file
|
||||
versionFile := filepath.Join(resourcesDir, "version.json")
|
||||
if err := os.WriteFile(versionFile, []byte("invalid json content"), 0644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create version manager with custom executable directory
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version (should return default version for corrupted file)
|
||||
result, err := vm.LoadVersionFromFile()
|
||||
if err != nil {
|
||||
t.Errorf("Expected no error with fallback mechanism for corrupted file, but got: %v", err)
|
||||
}
|
||||
|
||||
// Should return default version
|
||||
if result.MainVersion != "0.0.0.0" {
|
||||
t.Errorf("Expected default version 0.0.0.0 for corrupted file, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if result.VersionInfo == nil {
|
||||
t.Error("Expected initialized VersionInfo map for corrupted file, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVersionWithDefaultCorrupted(t *testing.T) {
|
||||
// Create a temporary directory
|
||||
tempDir, err := os.MkdirTemp("", "version_test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// Create resources directory
|
||||
resourcesDir := filepath.Join(tempDir, "resources")
|
||||
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create corrupted version file
|
||||
versionFile := filepath.Join(resourcesDir, "version.json")
|
||||
if err := os.WriteFile(versionFile, []byte("invalid json content"), 0644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create version manager with custom executable directory
|
||||
vm := NewVersionManager()
|
||||
vm.executableDir = tempDir
|
||||
|
||||
// Test loading version with default (corrupted file)
|
||||
result := vm.LoadVersionWithDefault()
|
||||
if result == nil {
|
||||
t.Fatal("Expected non-nil result from LoadVersionWithDefault for corrupted file")
|
||||
}
|
||||
|
||||
if result.MainVersion != "0.0.0.0" {
|
||||
t.Errorf("Expected default version 0.0.0.0 for corrupted file, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if result.VersionInfo == nil {
|
||||
t.Error("Expected initialized VersionInfo map for corrupted file, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateDefaultVersion(t *testing.T) {
|
||||
vm := NewVersionManager()
|
||||
|
||||
result := vm.createDefaultVersion()
|
||||
if result == nil {
|
||||
t.Fatal("Expected non-nil result from createDefaultVersion")
|
||||
}
|
||||
|
||||
if result.MainVersion != "0.0.0.0" {
|
||||
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
||||
}
|
||||
|
||||
if result.VersionInfo == nil {
|
||||
t.Error("Expected initialized VersionInfo map, got nil")
|
||||
}
|
||||
|
||||
if len(result.VersionInfo) != 0 {
|
||||
t.Errorf("Expected empty VersionInfo map, got %d entries", len(result.VersionInfo))
|
||||
}
|
||||
}
|
||||
41
Go_Updater/version/version.go
Normal file
41
Go_Updater/version/version.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
var (
|
||||
// Version is the current version of the application
|
||||
Version = "1.0.0"
|
||||
|
||||
// BuildTime is set during build time
|
||||
BuildTime = "unknown"
|
||||
|
||||
// GitCommit is set during build time
|
||||
GitCommit = "unknown"
|
||||
|
||||
// GoVersion is the Go version used to build
|
||||
GoVersion = runtime.Version()
|
||||
)
|
||||
|
||||
// GetVersionInfo returns formatted version information
|
||||
func GetVersionInfo() string {
|
||||
return fmt.Sprintf("Version: %s\nBuild Time: %s\nGit Commit: %s\nGo Version: %s",
|
||||
Version, BuildTime, GitCommit, GoVersion)
|
||||
}
|
||||
|
||||
// GetShortVersion returns just the version number
|
||||
func GetShortVersion() string {
|
||||
return Version
|
||||
}
|
||||
|
||||
// GetBuildInfo returns build-specific information
|
||||
func GetBuildInfo() map[string]string {
|
||||
return map[string]string{
|
||||
"version": Version,
|
||||
"build_time": BuildTime,
|
||||
"git_commit": GitCommit,
|
||||
"go_version": GoVersion,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user