如何在 Go 项目中输出版本信息?(如何在拼多多开网店)

网友投稿 277 2022-06-17


我们经常在使用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 -versionv

0.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

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

本文总结

本文内容到此就结束了,这里为大家简单总结一下:

主要通过ldflags参数在项目进行构建时进行变量赋值。

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:带你重新认识字符串、字节、rune和字符
下一篇:整洁架构(Clean Architecture)的Go微服务: 设计原则(整洁架构pdf)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~