GO BUILD如何在编译时打包编译版本、编译时间等信息到目标执行文件中

作者: jekkay 分类: golang,软件,默认 发布时间: 2020-09-10 10:33

GO BUILD如何在编译时打包编译版本、编译时间等信息到目标执行文件中

1. 概述

我们在编译GO程序的时候,为方便查看版本等信息,会通常喜欢在编译的时候将这些内容打包进二进制可执行文件中,方便通过执行特定指令去查看。这对于在开发过程中,版本号是同一个,每次都不知道是上午打包的,还是刚刚打包的版本。为此,我们就特别需要这种对开发友好的编译版本信息能够直观的展示出来的功能。

我们在使用visual studio开发桌面程序的时候,有个很好的特性就是build版本是可以自动累加的,不需要每次去变更源代码,非常好用,对于和测试定位时可以直观地指导是什么版本,避免经常发生QA用老版本去测试新功能的诡异情况。

2. Go BUILD

经过查阅相关资料,发现GO BUILD利用 ldflags也是支持将编译版本自动地打包到可执行文件中,接下来介绍如何去打包编译时间、编译版本信息到目标可执行文件中。

2.1 准备模板

首先,我们准备一个模板,比如我想每次编译的时候把编译时间、GO版本信息编译到目标文件中,那么先准备一个模板文件,如下图:

模板

/**
 * 定义软件的编译信息,方便查阅
 * by Jekkay Hu, 2020-02-28
 */

var (
    BuildTime      = "unknown"
    BuildGoVersion = "unknown"
)

2.2 版本信息输出

在软件的输出版本信息中,这上述的编译时间和GO编译版本也一并输出如下图所示。

输出版本信息

2.3 编译选项

我们可以在编译的时候,添加如下格式的编译信息,将自己所需信息编译进去,格式如下:

target := go build -ldflags "${FLAGS}" {srcTarget}
FLAGS := FLAG{1+} := FLAG FLAG FLAG FLAG...
FLAG = -X 'package.variable=value'

举个例子,比如:

go build -ldflags "-X 'main.var1=test1' -X 'common/client.version.var2=hello world'"

注意:如果值没有空格的话,可以不用加单引号,如果有空格等特殊字符,则需要加上单引号,不然会报错。

了解完之后,就可以写编译脚本了,如下图所示:

编译

// http://www.easysb.cn/2020/09/792.html

BUILD_TIME=$(date '+%Y/%m/%d %H:%M:%S')
# echo ${BUILD_TIME}
BUILD_GO_VERSION=$(go version | awk '{print $3"@"$4}')
# echo ${BUILD_GO_VERSION}
EXTRA_FLAGS="-X 'mastiff/mastiff/common/version.BuildTime=${BUILD_TIME}' -X mastiff/mastiff/common/version.BuildGoVersion=${BUILD_GO_VERSION} " 

go build -ldflags "${EXTRA_FLAGS}" -o ${DIST_FOLDER}/bin/mastiffdaemon mastiff/mastiff/mastiffdaemon

上面是我的代码,大家在使用时,需要根据自己的文件目录结构进行动态调整。

2.4 测试执行结果

执行目标文件,就可以得到编译的相关信息,如下图所示。

执行结果

如有疑问,可以在我的博客下留意,欢迎交流:http://www.easysb.cn/2020/09/792.html

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据