使用去管理版本的方法示例

  


  

  

如果你曾经运行过码头工人的版本,
  

  

就会发现它提供了很多信息:

        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))   }      

使用去管理版本的方法示例