Go程序版本信息(一)

日期:2022-01-25 11:02:18

作者:JonathanJiang

此文章为个人笔记,有误请指正,推荐读者查看参考资料的原文

一、参考资料

  1. Golang中管理程序的版本信息
  2. Golang程序版本管理
  3. ldflags_使用ldflags设置Go应用程序的版本信息
  4. 软件项目版本号的命名规则及格式
  5. 官方文档_ldflags
  6. 官方文档_link

二、版本信息

2.1 使用目的

追踪、管理软件的变更迭代,能够提高开发效率

2.2 GNU命名方式

主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
示例 : 1.2.1、     2.0、      5.0.0 build-13124
情景 主版本号 子版本号 修正版本 最终版本号
项目初始版本 1 0 0 1.0.0
修复bug或局部修改 不变 不变 +1 1.0.1
增加功能、兼容优化、性能优化 不变 +1 归零 1.1.0
重大修改或修改过多,导致项目整体发生变化,无法向前兼容 +1 归零 归零 2.0.0

2.3 查看方式

docker举例,查看版本信息有子命令参数两种方式

# 使用参数查看
jonathanjiang@linux:~$ docker -v
Docker version 20.10.12, build e91ed57# 使用子命令查看
jonathanjiang@linux:~$ docker version
Client: Docker Engine - CommunityVersion:           20.10.12API version:       1.41Go version:        go1.16.12Git commit:        e91ed57Built:             Mon Dec 13 11:45:33 2021OS/Arch:           linux/amd64Context:           defaultExperimental:      true
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied

后续的代码中模仿docker的形式,提供版本信息

三、硬编码版本信息(不推荐)

  • 项目simple_app目录结构

    jonathanjiang@linux:simple_app$ tree
    .
    ├── app
    ├── go.mod
    ├── main.go
    ├── simple_app
    └── version└── version.go1 directory, 5 files
    

    将版本信息单独放入version包中,引用即可

  • main.go代码

    package mainimport ("flag""fmt""gitee.com/Jonathan_Jiang/simple_app/version"
    )func main() {v := flag.Bool("v", false, "Print Version")flag.Parse()vi := version.GetVersion()// 参数获取if *v {fmt.Printf("SimpleApp Version %s Built %s \n", vi.Version, vi.Built)return}// 命令方式args := flag.Args()if len(args) > 0 && args[0] == "version" {fmt.Printf("Version: \t %s \n", vi.Version)fmt.Printf("Built: \t\t %s \n", vi.Built)fmt.Printf("Platform: \t %s \n", vi.Platform)fmt.Printf("GoVersion: \t %s \n", vi.GoVersion)fmt.Printf("GitCommit: \t %s \n", vi.GitCommit)return}// 正常执行fmt.Println("start app")
    }
  • version/version.go代码

    package versiontype VersionInfo struct {Version   string `json:"version"`Built     string `json:"built"`Platform  string `json:"platform"`GoVersion string `json:"go_version"`GitCommit string `json:"git_commit"`
    }func GetVersion() VersionInfo {return VersionInfo{Version:   "1.0.0",Built:     "mock",Platform:  "mock",GoVersion: "mock",GitCommit: "mock",}
    }
  • 使用效果

    # 编译程序,-o app 命名为app
    jonathanjiang@linux:simple_app$ go build
    # 参数方式,查询版本信息
    jonathanjiang@linux:simple_app$ ./simple_app -v
    SimpleApp Version 1.0.0 Built mock
    # 命令方式,查询版本信息
    jonathanjiang@linux:simple_app$ ./simple_app version
    Version:         1.0.0
    Built:           mock
    Platform:        mock
    GoVersion:       mock
    GitCommit:       mock
    # 正常执行
    jonathanjiang@linux:simple_app$ ./simple_app
    start app
    

四、link版本信息(推荐)

  • 优化

    版本信息一般是在发布时确定的,所以最好不要写死在代码中。最好是在编译时传入信息,类似C/C++在代码中预置版本宏定义,在编译中从外部传入版本号,虽然golang不支持宏定义,但是提供了link去处理相似场景

  • link基础

    • go build -ldflags,编译时将参数传递给go tool link
    • go tool link -X importpath.name=value,将importpath.name的值设置为value
  • 修改version/version.go代码

    package versionimport ("fmt""runtime"
    )var (// 声明包变量,方便link设置值// 尽量不要作为函数入参使用version    stringbuilt      stringgit_commit string
    )type VersionInfo struct {Version   string `json:"version"`Built     string `json:"built"`Platform  string `json:"platform"`GoVersion string `json:"go_version"`GitCommit string `json:"git_commit"`
    }func GetVersion() VersionInfo {// 使用runtime读取go信息return VersionInfo{Version:   version,Built:     built,Platform:  fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),GoVersion: runtime.Version(),GitCommit: git_commit,}
    }
  • 使用

    # 编译
    jonathanjiang@linux:simple_app$ go build -ldflags="-X 'gitee.com/Jonathan_Jiang/simple_app/version.version=1.0.1' -X 'gitee.com/Jonathan_Jiang/simple_app/version.built=2022-01-26T16:57:31+0800' -X 'gitee.com/Jonathan_Jiang/simple_app/version.git_commit=abcdef'"# 打印
    jonathanjiang@linux:simple_app$ ./simple_app version
    Version:         1.0.1
    Built:           2022-01-26T16:57:31+0800
    Platform:        linux/amd64
    GoVersion:       go1.17.2
    GitCommit:       abcdefjonathanjiang@linux:simple_app$ ./simple_app -v
    SimpleApp Version 1.0.1 Built 2022-01-26T16:57:31+0800
    
  • 注意:

    importpath是指变量的包路径,比如我在main包中引用version包,其引用路径是gitee.com/Jonathan_Jiang/simple_app/version,那么你在go build时就要把包路径带进去,不然link找不到变量,也就无法赋值

14.Go程序版本信息(一)相关推荐

  1. 让软件版本信息自动引用SVN修订版本号

    软件发布出去后通常用户反馈一个BUG时往往需要知道程序版本号.当软件发布的版本多了后版本号的管理变的麻烦,当然正式版本发布周期较长手动管理版本号是合理的.如果是临时编译的测试版本,则可以让程序自动引用 ...

  2. 给Qt程序加上版本信息

    2019独角兽企业重金招聘Python工程师标准>>> windows下的可执行文件的属性中有版本这个信息,她含有版本信息,描述,版权等等.对于qt的程序,要含有这样的信息,该怎么办 ...

  3. 删除隐藏版本信息 版本回退_Qt如何给程序添加版本信息

    " 阅读本文需要3分钟 自己亲手编译过 Qt Creator 源码的朋友都有这样的疑惑,为啥编译完成后最终生成的动态库.插件以及 exe 都会带数字 4 后缀,下面记录下如何出现以及如何解决 ...

  4. python打包加版本信息_使用pyi-set_version为PyInstaller打包出来的程序附加版本信息...

    本文将讲述如何使用 pyi-grab_version获取版本信息的模板文件,以及使用 pyi-set_version为打包好的程序附加版本信息. 当然了,在开始前,需要你已经安装好了 PyInstal ...

  5. 怎样设置WinForm程序的公司名称、产品名称、版本信息

    一.实现效果 实现在.NET Framework的Winform程序里面设置程序的公司名称.产品名称.版本信息内容:且在程序里面展示对应的信息内容. 二.实现思路 ①在启动程序里面设置程序的信息 ②获 ...

  6. Go语言程序编译注入版本信息,提升Debug速度!

    背景 为了对运行程序进行版本追踪,避免各个版本的服务程序混淆,通常的做法为在go build编译的时候程序注入 版本标志.编译时间.当前分支.当前 Tag.当前的提交号等信息,让go程序在运行的时候就 ...

  7. Qt软件发布(版本信息,Release版程序,代码打包,制作安装包)

    序言 当我们完成了Qt程序的开发,希望交予测试,或是正式发布的时候,需要将我们的程序进行层层封装,最终以一个安装包的形式呈现给用户.专业版的软件发布,以Qt软件为例,需要三个步骤:生成版本信息,生成R ...

  8. AssemblyInfo.cs文件:包含程序版本、信息、版权的属性文件(转转转)

    AssemblyInfo.cs文件:包含程序版本.信息.版权的属性文件 先介绍AssemblyInfo.cs文件中的程序集属性 内容: using System.Reflection; using S ...

  9. ldflags_使用ldflags设置Go应用程序的版本信息

    ldflags 介绍 (Introduction) When deploying applications into a production environment, building binari ...

最新文章

  1. loadrunner代理录制脚本方法介绍
  2. 模拟电路概念知识体系梳理(基础部分)
  3. Spring Boot 项目的这些文件都是干啥用的?
  4. mysql 某列加全文索引_MySQL使用全文索引(fulltext index)---高性能
  5. Oracle数据库时间修改
  6. Intellij IDEA 14 安装之后
  7. DOC命令大全--(转)
  8. 每日一道剑指offer-从尾到头打印链表
  9. charts引入icon图片_如何在React中优雅的使用icon
  10. 【建议收藏】货币交易信息爬取+筛选(Python附源码)
  11. 三星android智能手机usb驱动程序,三星智能手机USB驱动
  12. java 打印 边距_缩小边距 – Java打印
  13. 用Qt实现一个桌面弹幕程序(六)-- -- 桌面客户端实现②
  14. 模拟信号如何转换为数字信号
  15. mac 清理 -OmniDiskSweeper
  16. Python与图像处理7
  17. sql注入-简要SQL注入
  18. APK瘦身记,如何实现高达53%的压缩效果
  19. 云服务器和独享虚拟主机的区别,云服务器和独享虚拟主机的区别
  20. 为什么1个字节是8个比特?

热门文章

  1. 基于spring 的开源框架
  2. VR虚拟现实网页+H5Builder实现手机VR效果(可生成apk,ios)
  3. plus初始化原理及plus is not defined,mui is not defined 汇总
  4. java 公网ip_JAVA获取公网ip
  5. GSG: Building Software Components for OMAP-L1/AM1x
  6. 淘淘商城第106讲——改造商品详情页面中的加入购物车板块
  7. 佛学:科学的角度看佛学故事“旗动?风动?心动!”
  8. vue 数组按时间排序
  9. ssm+java计算机毕业设计影城在线售票及票房数据分析系统8b9a0(程序+lw+源码+远程部署)
  10. 26个字母vs几万个汉字,中国人的打字机曾造得多艰难?