场景

一般改动程序后,去编译生成一个二进制文件,但是有时候做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

总结