详解如何在Go项目中输出版本信息
我们经常在使用CLI工具的时候,都会有这样的参数输出:
➜~dockerversion Client:DockerEngine-Community Version:18.09.2 APIversion:1.39 Goversion:go1.10.8 Gitcommit:6247962 Built:SunFeb1004:12:392019 OS/Arch:darwin/amd64 Experimental:false ➜~
可以打印出构建时对应的版本信息,比如Version,GoVersion,GitCommit等,这个是如何实现的呢?
实现
主要是通过ldflags参数来实现在构建的时候对变量进行赋值。
比如下面一段代码:
packagemain import( "flag" "fmt" "os" ) //需要赋值的变量 varversion="" //通过flag包设置-version参数 varprintVersionbool funcinit(){ flag.BoolVar(&printVersion,"version",false,"printprogrambuildversion") flag.Parse() } funcmain(){ ifprintVersion{ println(version) os.Exit(0) } fmt.Printf("exampleforprintversion") }
构建命令:
gobuild-ldflags"-Xmain.version=v0.1"-oexample
程序输出:
➜./example version=v0.1
参数说明
1、-ldflagsbuild命令中用于调用接链接器的参数
-ldflags'[pattern=]arglist' argumentstopassoneachgotoollinkinvocation.
2、-X链接器参数,主要用于设置变量
-Ximportpath.name=value Setthevalueofthestringvariableinimportpathnamednametovalue. NotethatbeforeGo1.5thisoptiontooktwoseparatearguments. Nowittakesoneargumentsplitonthefirst=sign.
一个完整的例子
这里将version包单独做了一个包存放,只需要引入即可:
packagemain import( "flag" "github.com/go-demo/version" ) //通过flag包设置-version参数 varprintVersionbool funcinit(){ flag.BoolVar(&printVersion,"version",false,"printprogrambuildversion") flag.Parse() } funcmain(){ ifprintVersion{ version.PrintVersion() } }
构建的shell如下(也可以放在Makefile中):
#!/bin/sh version="v0.1" path="github.com/go-demo/version" flags="-X$path.Version=$version-X'$path.GoVersion=$(goversion)'-X'$path.BuildTime=`date+"%Y-%m-%d%H:%m:%S"`'-X$path.GitCommit=`gitrev-parseHEAD`" gobuild-ldflags"$flags"-oexampleexample-version.go
TIPS:如果值内容中含有空格,可以用单引号
最终版本输出:
➜shbuild.sh ➜./example-version Version:v0.1 GoVersion:goversiongo1.13.1darwin/amd64 GitCommit:a775ecd27c5e78437b605c438905e9cc888fbc1c BuildTime:2020-01-0919:01:51
完整代码:https://github.com/go-demo/version
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。