当前位置: 首页 > 编程笔记 >

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

万俟棋
2023-03-14
本文向大家介绍详解如何在Go项目中输出版本信息,包括了详解如何在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/version

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 我正试图为一个使用蓝牙通信的应用程序启动一个颤振项目。为此,我使用了颤振蓝。 不幸的是,当试图运行(在Android设备上)我创建的第一个例子我遇到了以下错误: 如果我在Android Studio,我会知道如何升级AndroidMinsdk版本,但在一个颤振项目(使用VSCode)上,我有点迷路了。 是否有可能增加颤振,以及如何增加颤振?

  • 本文向大家介绍详解如何运行vue项目,包括了详解如何运行vue项目的使用技巧和注意事项,需要的朋友参考一下 在师兄的推荐下入坑vue.js ,发现不知如何运行GitHub上的开源项目,很尴尬。通过查阅网上教程,成功搭建好项目环境,同时对前段工程化有了朦朦胧胧的认知,因此将环境搭建过程分享给大家。 可以看下我的github:https://github.com/padipata ,里面有我学习、工作

  • 问题内容: 我正在寻找一种解决方案,可以多路复用一些通道输出。 我有一个数据源,它是从我发送到单个通道的读取的。另一方面,我有一个从通道读取的websocket请求处理程序。现在,发生了两个客户端创建一个websocket连接的情况,它们均从同一通道读取,但每个客户端仅获得部分消息。 代码示例(简体): 现在,当两次被调用时,第二个调用仅返回在第一个调用中创建的通道,这将导致上述问题。 问题是:

  • 本文向大家介绍详解如何在vue项目中引入elementUI组件,包括了详解如何在vue项目中引入elementUI组件的使用技巧和注意事项,需要的朋友参考一下 前提:已经安装好Vue 初始化vue 运行初始化demo 运行一下初始后的demo,如果没有问题则进行安装elementUI 安装 elementUI 引入elementUI 在main.js中引入elementUI 测试 下面我们来测试一

  • 问题内容: 我写了一个小小的go脚本,并使用strace跟踪了该脚本,我试图使用netlink协议从内核中获取审核消息,就像auditd一样。 以下是我的旅途中strace的输出脚本- http://paste.ubuntu.com/8272760/ 我试图找到auditd提供给sendto函数的参数。当我在auditd上运行strace时,我得到以下输出 当我追踪我的go文件时,我得到以下输出。

  • 本文向大家介绍Python最基本的输入输出详解,包括了Python最基本的输入输出详解的使用技巧和注意事项,需要的朋友参考一下 输出 用print加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下: print语句也可以跟上多个字符串,用逗号“,”隔开,就可以连成一串输出: print会依次打印每个字符串,遇到逗号“,”会输出一个空格,因此,输出的字符串