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\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 或者某个编译脚本中。