2

我在使用供应商目录中的 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 复制的必要版本的软件包,但我得到了错误。但是,当我从供应商删除 golang.google.org/grpc 文件夹时,我的项目从 gopath 获取依赖项并且它工作正常,尽管一个 gopath 是我在供应商目录中的副本并且供应商目录中的所有其他库都工作正常除了grpc。

4

1 回答 1

3

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

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

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

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

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

  2. 如果您使用 Go >= 1.11,请切换到更新的 Go 模块构建系统。这将让您在升级依赖项时继续控制,而无需使用project1/vendor/...树来混淆类型系统。

于 2019-08-03T08:04:44.093 回答