3

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

提前致谢!

4

1 回答 1

0

我们遇到了完全相同的问题,经过大量研究后,我们在对 GitHub 问题的评论中偶然发现了解决方案: cmd/link: -X doesn't work for vendored packages

解决方案:应指定相对于的完整路径名。$GOPATH

它在开发时有效,git.mycompany.com/utils/info因为完整路径是正确的。
它不适用于供应商的依赖项,因为完整路径$GOPATH就像git.mycompany.com/name-of/package/vendor/git.mycompany.com/utils/info.Version=1.0.0

不幸的是,似乎没有关于此的文档(有关更多信息,请查看问题),但正如 Dave Cheney 在评论中指出的那样:

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

于 2018-10-23T13:16:22.507 回答