本文介绍如何在 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(BuildTimestringVersionstring)funcgetVersion1()string{returnfmt.Sprintf("%vbuild:%v\n",Version,BuildTime)}
编译:
GO111MODULE=ongobuild-ldflags"-X'dbtool/cmd.BuildTime=${BuildTime}'-X'dbtool/cmd.Version=${Version}'"-modvendor-odbtool.exemain.go||exit1
方法2:调用C函数
准备:
Version="v1.0"BuildTime=`date+'%Y-%m-%d%H:%M:%S'`GIT_VERSION=$Version"build:"$BuildTimeecho"Generated"$VER_FILE"forversion:"$GIT_VERSIONecho"#ifndefPROJECT_VERSION_H">$VER_FILEecho"#definePROJECT_VERSION_H">>$VER_FILEecho"">>$VER_FILEecho"#defineVERSION_NUMBER"$GIT_VERSION"">>$VER_FILEecho"">>$VER_FILEecho"#endif">>$VER_FILEecho"Jobdone!!"
代码:
/*#include<stdio.h>#include"version.h"char*GetVersion(){staticcharbuffer[64]={0};//代码中指定版本信息snprintf(buffer,64,"%sbuild:%s%s\r\n","v1.0",__DATE__,__TIME__);//由脚本生成到文件//snprintf(buffer,64,"%s\r\n",VERSION_NUMBER);returnbuffer;}*/import"C"//注:以上代码必须放到Goalng正式语句之前,且import"C"后必须空一行funcgetVersion()string{name1:=C.GetVersion()name:=C.GoString(name1)returnfmt.Sprintf("%v",name)}
编译:
GO111MODULE=ongobuild-modvendor-odbtool.exemain.go||exit1
四、测试
$./dbtool.exe--versiondbtool.exeversionv1.0build:2021-11-0423:14:58
BuildTime 使用 date 命令生成日期,可用默认的形式,如下:
$./dbtool.exe--versiondbtool.exeversionv1.0build:Nov4202123:15:30
五、维护
需在编译脚本中修改版本号,可手动修改,也可根据 SVN 或 GIT 版本迭代自动生成(散见于笔者多年前的文章)。
六、源码仓库
源码在 github 仓库: https://github.com/latelee/cmdtool