Go程序版本信息(一)

日期:2022-01-25 11:02:18

此文章为个人笔记,有误请指正,推荐读者查看参考资料的原文

一、参考资料

二、版本信息

2.1 使用目的

追踪、管理软件的变更迭代,能够提高开发效率

GNU
主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
示例 : 1.2.1、     2.0、      5.0.0 build-13124
情景主版本号子版本号修正版本最终版本号
项目初始版本1001.0.0
修复bug或局部修改不变不变+11.0.1
增加功能、兼容优化、性能优化不变+1归零1.1.0
重大修改或修改过多,导致项目整体发生变化,无法向前兼容+1归零归零2.0.0

2.3 查看方式

docker子命令参数
# 使用参数查看
jonathanjiang@linux:~$ docker -v
Docker version 20.10.12, build e91ed57

# 使用子命令查看
jonathanjiang@linux:~$ docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:33 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied

后续的代码中模仿docker的形式,提供版本信息

三、硬编码版本信息(不推荐)

jonathanjiang@linux:simple_app$ tree
.
├── app
├── go.mod
├── main.go
├── simple_app
└── version
    └── version.go

1 directory, 5 files
package main

import (
	"flag"
	"fmt"

	"gitee.com/Jonathan_Jiang/simple_app/version"
)

func main() {
	v := flag.Bool("v", false, "Print Version")

	flag.Parse()

	vi := version.GetVersion()

	// 参数获取
	if *v {
		fmt.Printf("SimpleApp Version %s Built %s \n", vi.Version, vi.Built)
		return
	}

	// 命令方式
	args := flag.Args()
	if len(args) > 0 && args[0] == "version" {
		fmt.Printf("Version: \t %s \n", vi.Version)
		fmt.Printf("Built: \t\t %s \n", vi.Built)
		fmt.Printf("Platform: \t %s \n", vi.Platform)
		fmt.Printf("GoVersion: \t %s \n", vi.GoVersion)
		fmt.Printf("GitCommit: \t %s \n", vi.GitCommit)
		return
	}

	// 正常执行
	fmt.Println("start app")
}

package version

type VersionInfo struct {
	Version   string `json:"version"`
	Built     string `json:"built"`
	Platform  string `json:"platform"`
	GoVersion string `json:"go_version"`
	GitCommit string `json:"git_commit"`
}

func GetVersion() VersionInfo {
	return VersionInfo{
		Version:   "1.0.0",
		Built:     "mock",
		Platform:  "mock",
		GoVersion: "mock",
		GitCommit: "mock",
	}
}

# 编译程序,-o app 命名为app
jonathanjiang@linux:simple_app$ go build
# 参数方式,查询版本信息
jonathanjiang@linux:simple_app$ ./simple_app -v
SimpleApp Version 1.0.0 Built mock 
# 命令方式,查询版本信息
jonathanjiang@linux:simple_app$ ./simple_app version
Version:         1.0.0 
Built:           mock 
Platform:        mock 
GoVersion:       mock 
GitCommit:       mock 
# 正常执行
jonathanjiang@linux:simple_app$ ./simple_app
start app
link
package version

import (
	"fmt"
	"runtime"
)

var (
    // 声明包变量,方便link设置值
    // 尽量不要作为函数入参使用
	version    string
	built      string
	git_commit string
)

type VersionInfo struct {
	Version   string `json:"version"`
	Built     string `json:"built"`
	Platform  string `json:"platform"`
	GoVersion string `json:"go_version"`
	GitCommit string `json:"git_commit"`
}

func GetVersion() VersionInfo {
    // 使用runtime读取go信息
	return VersionInfo{
		Version:   version,
		Built:     built,
		Platform:  fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
		GoVersion: runtime.Version(),
		GitCommit: git_commit,
	}
}

# 编译
jonathanjiang@linux:simple_app$ go build -ldflags="-X 'gitee.com/Jonathan_Jiang/simple_app/version.version=1.0.1' -X 'gitee.com/Jonathan_Jiang/simple_app/version.built=2022-01-26T16:57:31+0800' -X 'gitee.com/Jonathan_Jiang/simple_app/version.git_commit=abcdef'"

# 打印
jonathanjiang@linux:simple_app$ ./simple_app version
Version:         1.0.1 
Built:           2022-01-26T16:57:31+0800 
Platform:        linux/amd64 
GoVersion:       go1.17.2 
GitCommit:       abcdef

jonathanjiang@linux:simple_app$ ./simple_app -v
SimpleApp Version 1.0.1 Built 2022-01-26T16:57:31+0800