使用供应商目录中的 google.golang.org/grpc 时出错

error while using google.golang.org/grpc from a vendor directory

我在使用供应商目录中的 google.golang.org/grpc 时遇到问题,我收到以下错误

cannot use &metadata.HeaderMD (type *"google.golang.org/grpc/metadata".MD) as type *"project1/vendor/google.golang.org/grpc/metadata".MD in argument to grpc.Header

虽然我使用的是从我的 gopath 复制的必要版本的包,但我还是收到了错误。但是,当我从 vendor 中删除 golang.google.org/grpc 文件夹时,我的项目从 gopath 获取依赖项并且它工作正常,尽管一个 gopath 是我在 vendor 目录和所有其他库中的副本vendor 目录工作正常,除了 grpc.

当您创建 project1/vendor/google.golang.org/grpc 时,这意味着对于 project1/... 下的包,google.golang.org/gprc/... 的导入将透明地重新映射到供应商版本。

project1 之外的任何软件包将继续导入非供应商的 google.golang.org/grpc/... 软件包。虽然 vendored 包可能是上游的副本,但 Go 将它们视为独立包。所以它们包含的类型是不等价的。

最有可能发生的事情是您的一个非供应商依赖项导入了 grpc 包并在其 public API 中使用了它的类型。当您使用 project1 中的 API 时,您将获得无法使用销售类型分配给变量的上游类型。

这个问题有两种可能的解决方案:

  1. 供应所有使用您已经供应的依赖项。

  2. 如果您使用的是 Go >= 1.11,请切换到 newer Go module build system。这将让您在升级依赖项时继续控制,而不会 project1/vendor/... 树混淆类型系统。