如何在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
> 本文在公众号"学点程序"首发 ![学点程序](https://img2018.cnblogs.com/blog/571950/202001/571950-20200109213312557-724452395.jpg)
关注公众号,了解更多相关技术内容!

原文地址:https://www.cnblogs.com/silenceper/p/12173651.html

时间: 2024-08-02 13:03:39

如何在Go项目中输出版本信息?的相关文章

如何在NodeJS项目中优雅的使用ES6

如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 现在开始Babel 在开始使用Babel之前,假设 1. 你已经安装了nodejs,并且已经熟悉了Js. 2. 你也可以使用npm安装各种依赖包. 3. 而且你也对ES6(后来改为

如何在Vue项目中使用vw实现移动端适配

https://www.w3cplus.com/mobile/vw-layout-in-vue.html  原文网址 如何在Vue项目中使用vw实现移动端适配 作者:大漠 日期:2018-01-25 点击:10362 vw Layout 布局 Vue mobile 编辑推荐:使用 Coding.net 搭建静态博客,自定义域名,全站 HTTPS 加密,自动实时部署, 立即托管您的网站! 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页

如何在maven项目中使用spring

今天开始在maven项目下加入spring. 边学习边截图. 在这个过程中我新建了一个hellospring的项目.于是乎从这个项目出发开始研究如何在maven项目中使用spring.鉴于网上的学习资料都是spring与jsp的整合.所以在这里我也使用spring+jsp. 从一个新建的maven项目hellospring出发开始研究.

如何在Vue项目中使用Typescript

0.前言 本快速入门指南将会教你如何在Vue项目中使用TypeScript进行开发.本指南非常灵活,它可以将TypeScript集成到现有的Vue项目中任何一个阶段. 1.初始化项目 首先,创建一个新的项目目录. mkdir typescript-vue-tutorial cd typescript-vue-tutorial 接着,在目录中创建如下目录结构. typescript-vue-tutorial/ ├─ dist/ └─ src/ └─ components/ TypeScript文件

如何在Vue项目中给路由跳转加上进度条

1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大减轻用户的等待压力,提升用户体验.本篇文章就来教你如何在Vue项目中实现这样的进度条. 2.安装Nprogress 虽然我们也可以自己手动实现这样的功能,但是,nprogress.js已经帮我们把进度条的样式呀,功能呀都已经封装的很好了,既然有现成的轮子,我们就直接使用轮子就好啦! npm inst

转:如何在Vue项目中使用vw实现移动端适配

https://www.w3cplus.com/mobile/vw-layout-in-vue.html 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着viewport单位越来越受到众多浏览器的支持,因此在<再聊移动端页面的适配>一文中提出了vw来做移动端的适配问题.到目前为止不管是哪一种方案,都还存在一定的缺陷.言外之意,还没有哪一个方案是完美的. 事实上真的不完美

探讨在项目中如何处理错误信息

一个项目中肯定需要处理各种各样的错误.而对于这些错误,一方面需要程序反应出这些错误并可以让程序员快速地 定位到,另一方面,在发生某些错误时需要给用户适当的错误提示.比如某个请求的方法是 public User getUserInfo(String userId) 此时请求参数userId为null,我在项目中会这么做 public User getUserInfo(String userId){ Assert.notNull(userId, "userId不能为空"); // .. }

vs下取得资源文件中的版本信息

转载于:http://www.cnblogs.com/procoder/archive/2009/11/13/windows-mobile-wtl-version.html 在Windows Mobile和Wince(Windows Embedded CE)下开发的产品,有时候需要显示当前产品的版本信息.一般来说,版本信息是保存在资源文件里面的,例如下图: 为了保持一致,所有版本信息应该都从资源文件读取,不应该另外硬编码(Hard code). 下面讲述读取资源文件版本信息的方法: 1.在资源文

NDK编程中如何在C文件中打印调试信息

1,在Android.mk文件中加上 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE  :=ndkdemoLOCAL_SRC_FILES :=com_app_test_nativeMethod.cLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRAR