使用ldflags设置Go变量与vendor文件夹冲突

时间:2018-06-01 16:07:04

标签: go vendor godeps ldflags

我正在开发一个小型Go应用程序,我想在构建或运行时设置一个特定变量(如Version,GitCommit,BuildID等)(go buildgo 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选项或其他东西冲突。

提前致谢!

1 个答案:

答案 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在评论中指出的那样:

  

这是实现销售的语言方式的副作用