我有2个grpc服务(service1
和service2
)彼此交互,在某些情况下,service1
的rpc响应将由{{1}中定义的结构组成},在经历了不可避免的重复的几种情况之后,我发现随着服务的增长,这些服务将变得难以管理,因此我现在将原始文件重组为类似这样的文件
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";
命令生成.pb.go
文件
protoc
该命令可以很好地生成ls proto | awk '{print "protoc --proto_path=proto proto/"$1"/*.proto --go_out=plugins=grpc:."}' | sh
文件,但是.pb.go
上的代码似乎无法正确导入模型,并且我不知道它是否相关,但是我何时运行该应用程序,它将引发此错误
service1.access.pb.go
我花了几个小时仔细研究如何正确导入另一个原型文件,我似乎找不到任何解决方法
答案 0 :(得分:0)
之所以出现关于model
的错误,是因为生成的文件使用了导入文件的go_package
,而model
不是有效的导入路径。您必须说服生成的文件以使用包的完整导入路径。
这就是我为源代码树所做的工作:我有一棵相似的原始文件树,它们相互导入。如果您的模块被命名为github.com/myapp
,然后使用protoc
运行--proto-path=<directory containing github.com>
,使用完整路径导入其他原型文件,即github.com/myapp/proto/service1/service1.proto
,并在service1.proto中定义go_package = service1
。在我的情况下,此设置可以正确写入导入路径。
在开始使用此解决方案之前,我使用的是go_package=<full path to proto>
,因此您也可以尝试一下。
答案 1 :(得分:0)
以Burak Serdar为基础,我想提供实现。
将软件包设置为要导入的原始文件,类似于此处的位置为完整路径的地方。我的路径通常是github.com/AllenKaplan/[project]/[package]/proto/
option go_package = [path];
在要导入的文件中添加导入。我的路径通常是[package]/proto/[package].proto
import = [path from protoc proto path]
最后一部分是protoc命令,其中您必须以连接导入路径和选项go_package路径的方式定义protopath
如果从github.com/AllenKaplan/[project]
目录执行,我会打电话
protoc -I. --go_out=./[package]/proto [package]/proto/[package].proto
-I. === --proto_path.
-I.
将原型路径设置为整个项目
请注意,在要导入的protoc
文件上调用.proto
时,您需要向输出中添加source_relative:
,以确保输出是从根目录开始的包。
从github.com/AllenKaplan/[project]/[package]
调用时我对导入协议的实现
protoc -I./proto --go_out=paths=source_relative:./proto [package].proto