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 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实践录:生成版本号和编译时间相关推荐
- linux 程序、动态库、静态库内部添加版本号和编译时间
2019独角兽企业重金招聘Python工程师标准>>> 给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2 ...
- linux中查询动态库版本的命令,linux 程序、动态库、静态库内部添加版本号和编译时间详解...
给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以, ...
- Golang实践录:命令行cobra库实例再三优化
本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...
- Golang实践录:命令行cobra库实例优化
本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...
- Golang实践录:调用C++函数
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中调用 C++ 函数. 起因 因工作需求,需要将一个工具由终端行的运行方式迁移到 we ...
- Golang实践录:静态资源文件整合:初步使用
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中整合静态资源文件,将静态资源文件编译到二进制可执行文件中,这与其它程序的打包可能是一 ...
- Golang实践录:静态资源文件整合:web服务
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...
- Golang实践录:命令行cobra库实例
本文使用 cobra 库实现一个命令行工具,类似 git.docker.kubectl 这类的工具. 本文仅为一个初具模型的示例,但有实践参考意义. 起因 在编程中,很多时候,程序都会处理多个参数,特 ...
- Golang实践录:开篇
自去年开始,因工作的关系,需要使用 Golang 进行开发.一来是工作,二来多了解一个新语言,总归是有好处.现在虽然不是主攻 Golang,但可能用来写一些小工具. 本系列不会系统介绍Golang,只 ...
最新文章
- linux的临时页表映射问题
- 为什么分数是循环小数
- 无限乱斗机器人ap出装_LOL:无限火力仅剩4天,这5个英雄一定要尝试!
- python语言的解释性特点指的是编写的程序不需要编译_解释性与编译型 Python2和python3的区别...
- Java并发编程--CountDownLatch
- AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
- 路由器用PPP0E上网
- mysql评论与回复一起查_mysql 查询所有评论以及回复
- php微信支付回调验证
- WDM驱动安装和卸载
- python group与groups 详解以及区分
- HTML 常用选择框
- 团队管理:需求之殇——两个凡是
- OneNET麒麟座应用开发之八:采集大气压力等环境参数
- Xcode13 新建项目 Products 目录显示方法
- 1,514人罹难,泰坦尼克号沉船事故背后的数据统计如何?
- CentOs6.5 详细安装步骤
- Mac下解决v2端口被占用,shadowsocket(ss)程序残留问题
- idea开发配置-模板配置
- 微前端 - micro-app 数据通信
热门文章
- ios10前台收到推送_IOS - 前台时的推送弹窗效果
- php rsa加密乱码_php RSA加解密
- java字符串拆分成数组_Java StringUtils字符串分割转数组的实现
- pcie16x能插1x的卡嘛?_小米米家直流变频电风扇1X改造增加充电电池,智米电风扇加电池---改造成功...
- 英伟达2022财年第二季度获得创纪录营收65.1亿美元
- 芯片短缺波及国内车市 5月国内汽车销量下降3.1%
- 任正非表示支持小女儿姚安娜搞文艺
- 中芯国际最终超额募资523.2亿元,14nm工艺打“鸡血”了
- 苹果A14芯片组件曝光,iPhone 12发布不远了?
- 支付宝老年大学招95后青年讲师:不要大厂经验高学历,只要会跳广场舞会钓鱼?...