详解如何在Go项目中输出版本信息
Go  /  管理员 发布于 4年前   617
我们经常在使用CLI工具的时候,都会有这样的参数输出:
➜ ~ docker versionClient: Docker Engine - Community Version: 18.09.2 API version: 1.39 Go version: go1.10.8 Git commit: 6247962 Built: Sun Feb 10 04:12:39 2019 OS/Arch: darwin/amd64 Experimental: false➜ ~
可以打印出构建时对应的版本信息,比如 Version,Go Version,Git Commit等,这个是如何实现的呢?
实现
主要是通过ldflags参数来实现在构建的时候对变量进行赋值。
比如下面一段代码:
package mainimport ( "flag" "fmt" "os")//需要赋值的变量var version = ""//通过flag包设置-version参数var printVersion boolfunc init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse()}func main() { if printVersion { println(version) os.Exit(0) } fmt.Printf("example for print version")}
构建命令:
go build -ldflags "-X main.version=v0.1" -o example
程序输出:
➜ ./exampleversion=v0.1
参数说明
1、-ldflags build命令中用于调用接链接器的参数
-ldflags '[pattern=]arg list' arguments to pass on each go tool link invocation.
2、-X 链接器参数,主要用于设置变量
-X importpath.name=value Set the value of the string variable in importpath named name to value. Note that before Go 1.5 this option took two separate arguments. Now it takes one argument split on the first = sign.
一个完整的例子
这里将version包单独做了一个包存放,只需要引入即可:
package mainimport ( "flag" "github.com/go-demo/version")//通过flag包设置-version参数var printVersion boolfunc init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse()}func main() { if printVersion { version.PrintVersion() }}
构建的shell如下(也可以放在Makefile中):
#!/bin/shversion="v0.1"path="github.com/go-demo/version"flags="-X $path.Version=$version -X '$path.GoVersion=$(go version)' -X '$path.BuildTime=`date +"%Y-%m-%d %H:%m:%S"`' -X $path.GitCommit=`git rev-parse HEAD`"go build -ldflags "$flags" -o example example-version.go
TIPS: 如果值内容中含有空格,可以用单引号
最终版本输出:
➜ sh build.sh➜ ./example -versionVersion: v0.1Go Version: go version go1.13.1 darwin/amd64Git Commit: a775ecd27c5e78437b605c438905e9cc888fbc1cBuild Time: 2020-01-09 19:01:51
完整代码:https://github.com/go-demo/version
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号