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

作者:silenceper 时间:2024-04-26 17:17:20 

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

来源:https://segmentfault.com/a/1190000021540924

标签:Go,输出,版本
0
投稿

猜你喜欢

  • 游戏的用户体验营销小札

    2009-08-30 15:13:00
  • Oracle 实现类似SQL Server中自增字段的一个办法

    2009-08-02 07:51:00
  • idea激活码最新获取方法(idea2020激活码汇总)

    2024-01-03 08:42:52
  • 利用Python如何画一颗心、小人发射爱心

    2021-01-11 09:11:50
  • Python基于进程池实现多进程过程解析

    2023-05-08 10:52:24
  • bootstrap选项卡使用方法解析

    2024-04-16 09:13:11
  • JAVA正则表达式匹配多个空格的解决方案

    2022-07-29 14:39:31
  • 浅谈关于axios和session的一些事

    2024-05-11 09:49:33
  • 动态加载JavaScript的小实践

    2009-11-12 12:38:00
  • Symfony学习十分钟入门经典教程

    2023-11-14 23:38:38
  • 一文带大家了解Go语言中的内联优化

    2024-02-19 15:47:19
  • 如何使用Typora+MinIO+Python代码打造舒适协作环境

    2023-11-12 15:12:10
  • 重新阅读《HTTP协议基础》

    2008-04-04 17:40:00
  • Python的代理类实现,控制访问和修改属性的权限你都了解吗

    2022-10-25 13:09:47
  • Python+OpenCV解决彩色图亮度不均衡问题

    2023-02-08 23:14:53
  • 浅析python协程相关概念

    2021-06-28 07:43:16
  • Window 64位下python3.6.2环境搭建图文教程

    2023-07-26 02:22:45
  • python切片中内存的注意事项总结

    2022-12-23 00:04:09
  • python连接mysql并提交mysql事务示例

    2024-01-15 04:43:37
  • Go语言基础for循环语句的用法及示例详解

    2024-02-07 16:15:34
  • asp之家 网络编程 m.aspxhome.com