本文介绍如何在 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 stringVersion 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: "$BuildTimeecho "Generated" $VER_FILE "for version:" $GIT_VERSIONecho "#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_FILEecho "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实践录:生成版本号和编译时间相关推荐

  1. linux 程序、动态库、静态库内部添加版本号和编译时间

    2019独角兽企业重金招聘Python工程师标准>>> 给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2 ...

  2. linux中查询动态库版本的命令,linux 程序、动态库、静态库内部添加版本号和编译时间详解...

    给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以, ...

  3. Golang实践录:命令行cobra库实例再三优化

    本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...

  4. Golang实践录:命令行cobra库实例优化

    本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...

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

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中调用 C++ 函数. 起因 因工作需求,需要将一个工具由终端行的运行方式迁移到 we ...

  6. Golang实践录:静态资源文件整合:初步使用

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中整合静态资源文件,将静态资源文件编译到二进制可执行文件中,这与其它程序的打包可能是一 ...

  7. Golang实践录:静态资源文件整合:web服务

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...

  8. Golang实践录:命令行cobra库实例

    本文使用 cobra 库实现一个命令行工具,类似 git.docker.kubectl 这类的工具. 本文仅为一个初具模型的示例,但有实践参考意义. 起因 在编程中,很多时候,程序都会处理多个参数,特 ...

  9. Golang实践录:开篇

    自去年开始,因工作的关系,需要使用 Golang 进行开发.一来是工作,二来多了解一个新语言,总归是有好处.现在虽然不是主攻 Golang,但可能用来写一些小工具. 本系列不会系统介绍Golang,只 ...

最新文章

  1. linux的临时页表映射问题
  2. 为什么分数是循环小数
  3. 无限乱斗机器人ap出装_LOL:无限火力仅剩4天,这5个英雄一定要尝试!
  4. python语言的解释性特点指的是编写的程序不需要编译_解释性与编译型 Python2和python3的区别...
  5. Java并发编程--CountDownLatch
  6. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
  7. 路由器用PPP0E上网
  8. mysql评论与回复一起查_mysql 查询所有评论以及回复
  9. php微信支付回调验证
  10. WDM驱动安装和卸载
  11. python group与groups 详解以及区分
  12. HTML 常用选择框
  13. 团队管理:需求之殇——两个凡是
  14. OneNET麒麟座应用开发之八:采集大气压力等环境参数
  15. Xcode13 新建项目 Products 目录显示方法
  16. 1,514人罹难,泰坦尼克号沉船事故背后的数据统计如何?
  17. CentOs6.5 详细安装步骤
  18. Mac下解决v2端口被占用,shadowsocket(ss)程序残留问题
  19. idea开发配置-模板配置
  20. 微前端 - micro-app 数据通信

热门文章

  1. ios10前台收到推送_IOS - 前台时的推送弹窗效果
  2. php rsa加密乱码_php RSA加解密
  3. java字符串拆分成数组_Java StringUtils字符串分割转数组的实现
  4. pcie16x能插1x的卡嘛?_小米米家直流变频电风扇1X改造增加充电电池,智米电风扇加电池---改造成功...
  5. 英伟达2022财年第二季度获得创纪录营收65.1亿美元
  6. 芯片短缺波及国内车市 5月国内汽车销量下降3.1%
  7. 任正非表示支持小女儿姚安娜搞文艺
  8. 中芯国际最终超额募资523.2亿元,14nm工艺打“鸡血”了
  9. 苹果A14芯片组件曝光,iPhone 12发布不远了?
  10. 支付宝老年大学招95后青年讲师:不要大厂经验高学历,只要会跳广场舞会钓鱼?...