本文介绍如何在 Golang 中生成和管理版本号及编译时间。
一、起因
__DATE____TIME_
二、思路
__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