使用ldflags设置Go变量与vendor文件夹冲突问题求助
这个问题其实是因为dep生成vendor目录后,Go编译器加载依赖的优先级和包的实际引用路径发生了变化,导致你原来的-ldflags参数指向的包和实际编译用的包不是同一个。
为什么会失效?
当你没有vendor目录时,Go会直接从GOPATH/src里加载git.mycompany.com/utils/info包,这时候-X git.mycompany.com/utils/info.Version=1.0.0能精准命中这个包的变量。
但生成vendor目录后,Go编译时会优先使用项目本地vendor里的依赖包,而你原来的-X参数还是指向GOPATH里的那个包——相当于你给A包的变量赋值,但实际编译用的是B包(vendor里的),自然看不到效果。
解决方法
你需要让-X参数指向当前编译环境下实际使用的info包路径,最稳妥的方式是用go list命令动态获取这个路径,避免手动写死出错:
先在项目根目录下执行这条命令,确认包的实际路径:
go list -f '{{.ImportPath}}' git.mycompany.com/utils/info当
vendor存在时,这个命令会返回带项目前缀的完整路径(比如git.mycompany.com/your-team/your-app/vendor/git.mycompany.com/utils/info),而没有vendor时会返回原来的路径。把这个路径整合到你的构建命令里,比如:
# 动态获取info包的实际导入路径 INFO_PACKAGE=$(go list -f '{{.ImportPath}}' git.mycompany.com/utils/info) # 用获取到的路径设置变量 go run -ldflags "-X ${INFO_PACKAGE}.Version=1.0.0 -X ${INFO_PACKAGE}.GitCommit=abc123 -X ${INFO_PACKAGE}.BuildID=dev-$(date +%Y%m%d)" app.go这样不管有没有
vendor目录,命令都能正确命中要设置的变量。
额外提示
如果你的项目已经切换到Go Modules(推荐替代dep),可以加上-mod=vendor参数强制使用vendor依赖,同时同样用go list动态获取包路径,效果是一样的。
内容的提问来源于stack exchange,提问作者Lebowski

