Golang实践录:生成版本号和编译时间
Posted 李迟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang实践录:生成版本号和编译时间相关的知识,希望对你有一定的参考价值。
本文介绍如何在 Golang 中生成和管理版本号及编译时间。
一、起因
笔者手上有几份祖传代码,最早一份90年代末写,次早是 2012 年写的,最新的代码,也是 2016 年写的,版本号倒有,但没有版本管理,虽然看得头大,但也得看。笔者写的程序一般会添加版本号和编译日期时间,也会加上版本控制,以方便追溯和维护。对于 C/C++ 语言,有__DATE__
和__TIME_
这两个宏定义,但 Golang 没有,因此加版本号还是额外研究。
二、思路
本文提供2个方法。一是通过编译时加的 ldflags 参数,对变量进行赋赋值;二是通过内嵌 C 语言函数实现。后者可以使用__DATE__
和__TIME_
,为了统一,均在脚本中生成日期日期,版本号亦在脚本中指定,因为在脚本中定制方便一些。
三、实现
方法1:Golang变量
准备:
Version="v1.0"
BuildTime=`date +'%Y-%m-%d %H:%M:%S'`
代码:
var (
BuildTime string
Version string
)
func getVersion1() string {
return fmt.Sprintf(" %v build: %v\\n", Version, BuildTime)
}
编译:
GO111MODULE=on go build -ldflags "-X 'dbtool/cmd.BuildTime=${BuildTime}' -X 'dbtool/cmd.Version=${Version}'" -mod vendor -o dbtool.exe main.go || exit 1
方法2:调用C函数
准备:
Version="v1.0"
BuildTime=`date +'%Y-%m-%d %H:%M:%S'`
GIT_VERSION=$Version" build: "$BuildTime
echo "Generated" $VER_FILE "for version:" $GIT_VERSION
echo "#ifndef PROJECT_VERSION_H" > $VER_FILE
echo "#define PROJECT_VERSION_H" >> $VER_FILE
echo "" >> $VER_FILE
echo "#define VERSION_NUMBER \\"$GIT_VERSION\\"" >> $VER_FILE
echo "" >> $VER_FILE
echo "#endif" >> $VER_FILE
echo "Job done!!"
代码:
/*
#include <stdio.h>
#include "version.h"
char* GetVersion()
{
static char buffer[64] = {0};
// 代码中指定版本信息
snprintf(buffer, 64, " %s build: %s %s\\r\\n", "v1.0", __DATE__, __TIME__);
// 由脚本生成到文件
//snprintf(buffer, 64, " %s\\r\\n", VERSION_NUMBER);
return buffer;
}
*/
import "C"
// 注:以上代码必须放到 Goalng 正式语句之前,且import "C"后必须空一行
func getVersion() string {
name1 := C.GetVersion()
name := C.GoString(name1)
return fmt.Sprintf(" %v", name)
}
编译:
GO111MODULE=on go build -mod vendor -o dbtool.exe main.go || exit 1
四、测试
$ ./dbtool.exe --version
dbtool.exe version v1.0 build: 2021-04-04 22:42:07
BuildTime 使用 date 命令生成日期,可用默认的形式,如下:
$ ./dbtool.exe --version
dbtool.exe version v1.0 build: Apr 4 2021 22:47:20
五、维护
需在编译脚本中修改版本号,可手动修改,也可根据 SVN 或 GIT 版本迭代自动生成(散见于笔者多年前的文章)。
六、源码仓库
https://github.com/latelee/cmdtool
以上是关于Golang实践录:生成版本号和编译时间的主要内容,如果未能解决你的问题,请参考以下文章