场景
一般改动程序后,去编译生成一个二进制文件,但是有时候做ab测试,需要知道当前版本信息是哪个gitTag编译或者gitCommitId编译出来的,又或者一个很老的bug,需要去复现,但是已经迭代了很多版本了,根本不知道当前这个二进制文件是基于哪个版本编译出来的
方法1每次都手工修改
package main
import (
"flag"
"fmt"
)
var (
GitCommitId = "aabbcc"
BuildTime = "1970-01-01T00:00:00+0800"
)
func main() {
version := flag.Bool("v", false, "version")
flag.Parse()
if *version {
fmt.Println("Git Commit: " + GitCommitId)
fmt.Println("Build Time: " + BuildTime)
return
}
}
每次编译的时候人工去修改GitCommitId和BuildTime
方法2编译时动态注入
//对上面main.go 利用ldflags动态设置对应包的变量
go build -ldflags "-X main.GitCommitId=`git rev-parse HEAD` -X main.BuildTime=`date +%FT%T%z`" -o main *.go
方法3使用Makefile
如果每次都输入像方法2那么长的字符,一般人估计是记不住的
export PATH:=${PATH}:${GOPATH}/bin:
OUTPUT=main
GITCOMMITID=`git rev-parse HEAD`
BUILD_TIME=`date +%FT%T%z`
LDFLAGS=-ldflags "-X main.GitCommitId=${GITCOMMITID} -X main.BuildTime=${BUILD_TIME}"
all:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ${LDFLAGS} -o ${OUTPUT} *.go