如果你曾经运行过码头工人的版本,
就会发现它提供了很多信息:
PS C:\Users\ tzh>码头工人版本 客户:码头工人引擎——社区 版本:19.03.4 API版本:1.40 版本:go1.12.10 Git提交:9013 bf5 建:2019年10月17日23:44:48星期四 OS/拱:windows/amd64 实验:假 服务器:码头工人引擎——社区 引擎: 版本:19.03.4 API版本:1.40(最低1.12版本) 版本:go1.12.10 Git提交:9013 bf5 建:2019年10月17日23:50:38星期四 OS/拱:linux/amd64 实验:假 containerd: 版本:v1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: 版本:1.0.0-rc8 +开发 GitCommit: 3 e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: 版本:0.18.0 GitCommit: fec3683
对于编译好的二进制文件而言,获取版本信息是非常重要的。
尽可能地提供详细信息,有利于后期的维护和排错。
对于版本信息等,有两种方式,
一种从外部获取,比如配置文件等,
另一种从源代码中获取,将配置信息写死在源代码中。
这两种都不太好,比如编译时间就不太好确定。
最好是能在去构建时确定这些信息。
幸好,去构建提供了一个选项叫做-ldflags[模式=]参数列表。
- x importpath.name=值 设置值的字符串变量importpath命名名称的值。 这是> 包buildinfo var BuildTime字符串 >之前运行去构建-ldflags=" - x公司/buildinfo.BuildTime=$(日期)的“会记录编译时间,
将BuildTime的值设置为编译时的时间,即从美元(日期)中获取的时间。
参考:
编译包和依赖关系 命令链接
包括构建信息执行
新增包裹/版本包,用于获取版本信息。
包版本//这些值应该是从外部传入的 var ( gitTag字符串=" " gitCommit字符串=" $格式:% H美元”从git//sha1,输出美元(git rev-parse头) gitTreeState字符串="不是一个git树”//git的树,“清洁”或“脏” buildDate字符串=" 1970 - 01 - 01 - t00:00:00z”//构建日期以ISO8601格式,输出美元(日期- u + ' % Y - % m - H % dT %: % m: %深圳') ) >之前包版本 导入( “fmt” “运行时” )//构建时的版本信息 VersionInfo struct类型{ GitTag字符串的json:“git_tag” GitCommit字符串的json:“git_commit” GitTreeState字符串的json:“git_tree_state” BuildDate字符串的json:“build_date” GoVersion字符串的json:“go_version” 编译器编译器字符串的json:“” 平台字符串的json:“平台” } func(信息VersionInfo)字符串String () { 返回info.GitTag } func Get () VersionInfo { 返回VersionInfo { GitTag: GitTag, GitCommit: GitCommit, GitTreeState: GitTreeState, BuildDate: BuildDate, GoVersion: runtime.Version (), 编译器:runtime.Compiler, 平台:fmt。Sprintf (“% s/% s”,运行时。美好的,runtime.GOARCH), } } >之前主要定义了一个结构体,保持版本信息。
有些信息可以通过运行时获取,有些是编译时传进来的。
这里没有明确的版本号,而是使用git标签作为版本标签。
最后,定义一个命令版本。
包cmd 导入( “编码/json” “fmt” "github.com/spf13/cobra” "tzh.com/web/pkg/version” ) var versionCmd=, cobra.Command { 使用:“版本”, 短:“打印服务器的版本信息”, 长:“打印服务器的版本信息”, 运行:func (cmd *眼镜蛇。命令,参数[]字符串){ printVersion () }, } func printVersion () { 信息:=version.Get () infoj犯错:=json.MarshalIndent(及信息,“”,“”)//加一点缩进 如果犯错!=nil { fmt。Printf("遇到了错误:% v \ n”,呃) } fmt.Println (string (infoj)) }使用去管理版本的方法示例