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实践录:生成版本号和编译时间的主要内容,如果未能解决你的问题,请参考以下文章

Golang实践录:查询数据表的几种方式

Golang实践录:查询数据表的几种方式

Golang实践录:获取系统信息

Golang实践录:获取系统信息

Golang实践录:利用反射reflect构建通用打印结构体接口

Golang实践录:调用C++函数