golang
在编译时,通过退出- ldflags
的参数能够替换编译的二进制包中的文件内容。例如替换版本号,构建日期,Git commit等信息时很不便。
例如替换main包中的变量如下:
package mainvar version="N/A"func main() { fmt.Println(version)}
编译时加上参数:go build -a -ldflags "-X main.version=1.2" -o bin/demo main.go
运行测试如下:
~ ./bin/demo1.2
然而测试到笼罩子包下的变量时,发现始终替换不胜利。
~ mkdir pkg~ touch pkg/vars.go~ cat pkg.vars.gopackage pkgimport "fmt"var version="N/A"func Init() { fmt.Printf("pkg.version: %s\n",version)}
在main函数中调用Init
func main() { fmt.Println(version) pkg.Init()}
编译测试:
go build -a -ldflags "-X main.version=1.2 -X pkg/pkg.version=1.3" -o bin/demo main.go./bin/demo1.2pkg.version: N/A
如上发现测试并不失效,网上有些说法是要绝对GOPATH上来写,要强制带上工程名,例如:demo/pkg/pkg.version
,这种是能够失效的,然而如果工程门路不止一级,例如github.com/csi/demo
,这样的全门路加上去也是不行的。
到底这个门路到底是什么,依据网上的材料检索,发现有一个工具能够间接列出编译的二进制文件中的变量门路:
go tool nm ./bin/demo | grep version 162f6e0 D demo/pkg.version 162f870 D main.version 1404b10 R main.version.str
通过这个工具,能够直观失去子包中的变量全门路到底是什么。如果是多级子目录的话,测试如下:
cd github.com/kubernetes-csi/csi-driver-nfsgo tool nm ./bin/amd64/nfsplugin| grep driverVersion 18a3600 D csi-driver-nfs/pkg/nfs.driverVersion 155b4c8 R csi-driver-nfs/pkg/nfs.driverVersion.str
发现其实只须要写一级目录就能够了,如果理论build过程中,还是有问题,那么能够应用go tool nm
工具查看门路即可解决问题。