Go语言编译构建时 ldflags 变量注入 Go 语言在编译构建时,可以注入变量。如下:
1 2 3 4 5 6 7 package mainimport "fmt" var Version = "0.0.1" func main () { fmt.Println(Version) }
一、常见的写法 我们需要将编译构建的 ldflags 写到文件中,makefile 是比较常见的方式。如下示例
1 2 3 4 5 6 ├── Makefile ├── VERSION ├── go.mod ├── main.go └── version.go |__ .git
version.go 的内容
1 2 3 4 5 6 7 8 9 package main var ( Version string GoVersion string Built string GitCommit string OSArch string )
main.go 的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import ( "flag" "fmt" ) func main() { var v bool flag.BoolVar(&v, "v", false, "Show Version") flag.Parse() if v { fmt.Printf("Version : %s \n", Version) fmt.Printf("Go Version : %s \n", GoVersion) fmt.Printf("Built : %s \n", Built) fmt.Printf("Git Commit : %s \n", GitCommit) fmt.Printf("OS/Arch : %s \n", OSArch) } }
VERSION 文件的内容
Makefile 的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 BIN = main # 注入变量 VERSION = `cat VERSION` GOVERSION = `go version` BUILT = `date "+%F %T"` GITCOMMIT = `git rev-parse HEAD` OSARCH = `go env GOOS`/`go env GOARCH` LDFLAGS = "\ -X 'main.Version=${VERSION}' \ -X 'main.GoVersion=${GOVERSION}' \ -X 'main.Built=${BUILT}' \ -X 'main.GitCommit=${GITCOMMIT}' \ -X 'main.OSArch=${OSARCH}' " main: go build -ldflags ${LDFLAGS} -o ${BIN} clean: @echo "clean ..." @rm -f ${BIN} @echo "clean OK" .PHONY: main clean
然后编译,运行
1 2 3 4 5 6 7 8 9 # make go build -ldflags " -X 'main.Version=`cat VERSION`' -X 'main.GoVersion=`go version`' -X 'main.Built=`date "+%F %T"`' -X 'main.GitCommit=`git rev-parse HEAD`' -X 'main.OSArch=`go env GOOS`/`go env GOARCH`' " -o main # ./main -v Version : 0.0.9 Go Version : go version go1.15 darwin/amd64 Built : 2022-08-11 17:01:50 Git Commit : d96d1a9e1d005423d2069effdc0eda32f142e7db OS/Arch : darwin/amd64