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

时间:2019-08-02 16:04:38

标签: go grpc grpc-go

在供应商目录中使用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。

1 个答案:

答案 0 :(得分:1)

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

project1以外的任何软件包都将继续导入非供应商的google.golang.org/grpc/...软件包。尽管供应商的软件包可能是上游的副本,但Go将它们视为独立的软件包。因此它们包含的类型不相等。

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

有两个可能的解决方案:

  1. 使用您已经提供的东西来出售所有依赖项。

  2. 如果使用的是Go> = 1.11,请切换到newer Go module build system。这样一来,您就可以继续控制升级依赖项的时间,而无需使用project1/vendor/...树来混淆类型系统。