我有 2 个 grpc 服务(service1
和 service2
),它们相互交互,在某些情况下,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/