我正在开发一个小型Go应用程序,我想在构建或运行时设置一个特定变量(如Version,GitCommit,BuildID等)(go build
或go run
)使用-ldflags
选项。
因为在我的公司中我们有几个具有相同基础的项目,所以我决定在单独的“信息”模块中提取带有这些变量的代码,该模块可以在每个项目中导入。
这是我的问题,比如我正在运行这样的应用程序:
go run -ldflags "-X git.mycompany.com/utils/info.Version=1.0.0" app.go
这很有效,即使变量不是“主”应用程序的一部分而且属于依赖项,变量也会正确设置。
然后我决定部署应用,因此我使用新的dep
工具生成vendor
文件夹。
因此,“info”依赖项现在位于:vendor/git.mycompany.com/utils/info
现在,当我运行上述相同的命令时,不再设置所述变量(Version
)。
我在这里遗漏了什么吗?
一旦我删除供应商文件夹,一切正常。这就像这个供应商文件夹与-ldflags
选项或其他东西冲突。
提前致谢!
答案 0 :(得分:0)
我们遇到了完全相同的问题,经过大量研究,我们偶然发现a comment中针对GitHub问题 cmd/link: -X doesn't work for vendored packages的解决方案。
解决方案:应指定相对于$GOPATH
的完整路径名。
在开发git.mycompany.com/utils/info
时可以使用,因为完整路径正确。
它不适用于供应商依赖性,因为来自$GOPATH
的 full 路径类似于git.mycompany.com/name-of/package/vendor/git.mycompany.com/utils/info.Version=1.0.0
不幸的是,似乎没有关于此的文档(有关更多信息,请参见问题),但正如Dave Cheney在评论中指出的那样:
这是实现销售的语言方式的副作用