Golang proto 文件管理和导入

标签 go protocol-buffers grpc

我有 2 个 grpc 服务(service1service2),它们相互交互,在某些情况下,service1 的 rpc 响应将包含在 service2 中定义的结构体中,在遇到重复不可避免的几种情况之后,我认为随着服务的增长,这些将很难管理,所以我现在将原始文件重组为这样的东西

.
├── app
...
├── proto
│   ├── service1
│   │   ├── service1.access.proto 
│   │   ├── service1.proto
│   ├── service2
│   │   ├── service2.access.proto
│   │   └── service2.proto
│   └── model
│       ├── model.service1.proto
│       └── model.service2.proto
└── proto-gen // the protoc generated files 
    ├── service1
    │   ├── service1.access.pb.go
    │   └── service1.pb.go
    ├── service2
    │   ├── service2.access.pb.go
    │   └── service2.pb.go
    └── model
        ├── model.service1.pb.go
        └── model.service2.pb.go

service1 需要导入 model/model.service2.proto 上的模型定义,所以我像这样导入它

import "model/model.service2.proto";

option go_package = "proto-gen/service1"; 

我使用这个 protoc 命令生成 .pb.go 文件

ls proto | awk '{print "protoc --proto_path=proto proto/"$1"/*.proto --go_out=plugins=grpc:."}' | sh

该命令生成了 .pb.go 文件,但 service1.access.pb.go 上的代码似乎没有正确导入模型,我不知道它是否相关,但是当我运行应用程序时,它会抛出此错误

cannot load model: malformed module path "model": missing dot in first path element

我花了几个小时在谷歌上搜索如何正确导入另一个原始文件,我似乎找不到任何解决方案

最佳答案

您收到有关 model 的错误的原因是因为生成的文件使用go_package导入文件的名称,以及 model不是有效的导入路径。您必须说服生成的文件使用包的完整导入路径。

这就是我为源树所做的事情:我有一个类似的相互导入的原始文件树。如果您的模块已命名,请说 github.com/myapp ,然后运行protoc--proto-path=<directory containing github.com> ,使用完整路径导入其他proto文件,即github.com/myapp/proto/service1/service1.proto ,并在 service1.proto 中定义 go_package = service1 。在我的例子中,此设置可以正确写入导入路径。

在采用此解决方案之前,我使用 go_package=<full path to proto> ,所以你也可以尝试一下。

关于Golang proto 文件管理和导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59367508/

相关文章:

python - 如何列出您在谷歌 Protocol Buffer 中定义的属性?

request - 根据我的请求设置日期值时,Google Protocol Buffers : c. toArray 不是一个函数

Python gRPC 取消客户端的一元流调用

java - 使用 Spring Boot 的 gRPC 和 REST 微服务

pointers - 将结构转换为 byte slice 的特定地址

gousb - 不是 OUT 端点

unicode - 从 rune 中获取 unicode 类别

go - 为什么golang类型实现sort.Interface时方法接收者不需要是指针?

protocol-buffers - gcloud 端点部署错误未解决类型

docker - 使用 gRPC 进行容器间通信