go - 从 vendor 目录使用 google.golang.org/grpc 时出错

标签 go grpc grpc-go

我在使用 vendor 目录中的 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/... 将透明地重新映射到 vendor 版本。

project1 之外的任何软件包都将继续导入非 vendor 的 google.golang.org/grpc/... 软件包。虽然 vendor 的包可能是上游的副本,但 Go 将它们视为独立的包。因此它们包含的类型并不等效。

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

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

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

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

关于go - 从 vendor 目录使用 google.golang.org/grpc 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57330027/

相关文章:

go - 是否可以向 protobuf 服务添加自定义方法类型?

go - 将结构体初始化为指针的目的是什么?

go - 同时运行 grpc 和 http 服务器

google-app-engine - Google 日历与 Google App Engine 的集成

ios - 在 iOS 中本地存储 protobuf 对象

go - Go 中时间的格式化

go - 将内部 go struct 数组转换为 protobuf 生成的指针数组

go - 我应该如何使用 protoc-gen-go-grpc?

sql - 将数组类型的数据库字段扫描到 Golang 中的数组/slice 中

go - 当字段实现 UnmarshalJSON 时,Unmarshal 嵌入式字段指针会出现困惑