概述

起因是这样的,在编译发布 golang 工程时,希望版本号中包含有 git revision number。 但是,没有commit之前,是没法知道 revision number 的,commit之后,如果要修改代码中 version 的相关信息,又会导致需要再次的 commit。

针对这种情况,希望能够在编译时动态的将当前的 git revision number 加入到 version 中。 这样,每次编译的时候获取当前 revision number,写入编译完的 二进制中,可以避免现有的代码(修改现有代码会导致又需要 commit)。

revision number 就是每个 commit 对应的 唯一字符串。

实现方式

实现的原理很简单:在 golang 编译时,通过 ldflags 给代码中的变量赋值,达到注入 revision number 的目的。

示例代码

package main

import "fmt"
import "flag" var (
version = "v0.0.1"
build = "not set"
) func main() { var v = flag.Bool("v", false, "display version") flag.Parse() if *v {
fmt.Printf("version: %s\n", version)
fmt.Printf("build : %s\n", build)
} else {
fmt.Println("hello, test version")
}
}

上面的代码编译运行,效果如下:

$ go build main.go
$ ./main
hello, test version $ ./main -v
version: v0.0.1
build : not set

编译时修改 build 变量

通过 ldflags, 动态修改 build

$ go build -ldflags "-X main.build=`git rev-parse HEAD`" main.go 

$ ./main -v
version: v0.0.1
build : 23af559af14a0b83c35a7f8bd0670a9741b1dc7e
  • -X main.build 修改 main package 中的 build 变量
  • `git rev-parse HEAD` 获取当前的 git revision number

总结

动态注入版本号,避免了手动修改版本号而导致的再次 commit,也避免了手动操作的繁琐和错误。 为了方便使用,也可以把上面的编译命令封装到 makefile 或者某个编译脚本中。

goalng 发布的版本中自动加上 git revision的更多相关文章

  1. 在mac中自动保存git用户名与密码如此简单

    之前为了实现在Windows中自动保存git用户名与密码,写过一篇博客终于解决“Git Windows客户端保存用户名与密码”的问题,需要进行一堆配置. 而在Mac OS X中这个操作竟然如此简单.只 ...

  2. 设置eclipse中自动添加get,set的注释为字段属性的注释

    一:说明 首先具体来看一下是什么效果,上图可能会更清楚一点 就是在get/set中自动加上属性的注释,那我们要怎么配置呢? 二:配置 2.1:下载附件 下载附件 2.2:替换class 原生的ecli ...

  3. [译] OpenStack Ocata 版本中的 53 个新功能盘点

    原文链接:https://www.mirantis.com/blog/53-new-things-to-look-for-in-openstack-ocata/ 原文作者:Nick Chase, Ra ...

  4. docker 发布应用时添加 git revision

    概要 实施步骤 获取 git revision 前端 git revision 注入 后端 git revision 注入 概要 docker 发布应用时, 将 git revision 注入到应用中 ...

  5. Jenkins 发布后自动创建git tag

    为了便于项目中对发布的版本进行回滚,所以我们每次发布完成以后自动创建git tag. 1,创建一个Jenkins任务,命名成为push_tag_demo: 2,配置<源码管理>,这里配置比 ...

  6. Jenkins进阶-发布后自动创建git tag(5)

    为了便于项目中对发布的版本进行回滚,所以我们每次发布完成以后自动创建git tag. 1,创建一个Jenkins任务,命名成为push_tag_demo: 2,配置<源码管理>,这里配置比 ...

  7. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  8. 自动发布工具版本从python2升级成python3后遇到的种种问题(涉及paramiko,Crypto,zipfile等等)

    从在公司实习到正式入职,一直还在被同事使用的是我写的一个自动发布工具.该工具的主要功能是:开发人员给出需要更新的代码包(zip格式),测试人员将该代码包部署到测服,这些代码包和JIRA数据库里的项目信 ...

  9. 新发布GoldenGate 12c版本中的主要特性

        业界领先的实时数据集成工具GoldenGate现在可以帮助企业在传统数据库和云平台.大数据平台之间进行实时复制.新的OGG 12c支持更多的异构数据库和大数据平台,进一步提升可管理性和对混合云 ...

随机推荐

  1. CyclicBarrier在多线程同步运行后相互访问的问题。

    CyclicBarrier的介绍 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相 ...

  2. JavaScript 常用函数总结

    javascript函数:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 .cookie函数 1.常规函数 javascript常规函数包括以下9个函数:  (1)alert ...

  3. Ubuntu 15.10 x64 安装 Android SDK

    操作系统:Ubuntu 15.10 x64 目标:安装 Android SDK 本文最后更新时间:2015-11-3 安装32位库文件 2013年9月的iPhone 5s是第一款64位手机,而Andr ...

  4. 如何查看SharePoint未知错误的详细信息

    在sharepoint 开发的时候,需要查看具体的sharepoint报错信息需要在配置文件中配置如下 通过下面方法就可以直接在出错页面查看错误信息.修改Web应用程序根目录上的Web.config文 ...

  5. 关于公司VPN专线接入的一个案例

    最近互通网络技术部门收到一到封邮件,是关于公司VPN接入的问题,问题如下: 条件:A区为办公地点1,其他办公电脑20台,并通过写字楼的宽带接口联通外网. B区为新办公地点2,预设应用.数据库.备份服务 ...

  6. 数字与字母 随机数小demo

    public String generateRandomId(){ String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI ...

  7. MariaDB kill命令

    MariaDB的KILL命令不只可以杀掉连接,而且可以只杀掉某连接当前的SQL,而不断开连接.KILL QUERY thread_id;kill thread_id可以杀掉当前的连接,而kill QU ...

  8. .net走向设计2—设计工具

    1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具

  9. 【笔记】memorymanagement-whitepaper-150215

    3 GC概念 Gc的职责: 1)  分配内存 2)  保证被引用的对象驻留内存 3)  对象不可达后将其占用内存回收 被引用对象被称为 “存活对象”. 不再被引用的对象称为“垃圾对象”. 找到垃圾对象 ...

  10. 1293. 3n+1数链问题 2016 12 23

    /* 1293. 3n+1数链问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 在计算机科学上,有很多类问题是无法解 ...