分享
  1. 首页
  2. 文章

如何在Go项目中输出版本信息?

silenceper · · 1929 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

关注《学点程序》公众号,了解更多Go相关技术 学点程序

我们经常在使用CLI工具的时候,都会有这样的参数输出:

➜ ~ docker version
Client: 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 main
import (
 "flag"
 "fmt"
 "os"
)
//需要赋值的变量
var version = ""
//通过flag包设置-version参数
var printVersion bool
func 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

程序输出:

➜ ./example
version=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 main
import (
 "flag"
 "github.com/go-demo/version"
)
//通过flag包设置-version参数
var printVersion bool
func init() {
 flag.BoolVar(&printVersion, "version", false, "print program build version")
 flag.Parse()
}
func main() {
 if printVersion {
 version.PrintVersion()
 }
}

构建的shell如下(也可以放在Makefile中):

#!/bin/sh
version="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 -version
Version: v0.1
Go Version: go version go1.13.1 darwin/amd64
Git Commit: a775ecd27c5e78437b605c438905e9cc888fbc1c
Build Time: 2020年01月09日 19:01:51

完整代码:https://github.com/go-demo/ve...


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:silenceper

查看原文:如何在Go项目中输出版本信息?

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1929 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏