zoukankan      html  css  js  c++  java
  • goalng 发布的版本中自动加上 git revision

    概述

    起因是这样的,在编译发布 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
    ", version)
       fmt.Printf("build  : %s
    ", 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 或者某个编译脚本中。

  • 相关阅读:
    重视个人成长 远离心灵鸡汤——由一则“心灵鸡汤”想到的
    vim 学习
    针对不同包之间的action跳转,怎么配置?
    Bootstrap 栅格系统
    struts2的s:iterator 标签 详解
    struts2 <s:property/>标签的使用--输出时间格式转换
    Myeclipse中把java代码导成UML类图
    大学毕业后坚持学习有什么用
    【BZOJ2754】喵星球上的点名(AC自动机)
    Codeforces Round #466 (Div. 2)
  • 原文地址:https://www.cnblogs.com/wang_yb/p/6163326.html
Copyright © 2011-2022 走看看