Golang proto 文件管理和导入

我有 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"; 

.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似乎没有正确导入模型,我不知道它是否相关但是当我运行应用程序时,它会抛出这个错误


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

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


慕仙森
浏览 347回答 3
3回答

Cats萌萌

您收到该错误的原因model是因为生成的文件使用了go_package导入文件的,并且model不是有效的导入路径。您必须说服生成的文件使用包的完整导入路径。这就是我为我的源代码树所做的:我有一个相似的 proto 文件树相互导入。如果您的模块命名为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>,因此您也可以尝试一下。

慕少森

在 Burak Serdar 的基础上,我想提供我的实现。在要导入的原型上设置包,类似于此位置是您的完整路径。我的路径一般是github.com/AllenKaplan/[project]/[package]/proto/option go_package = [path];在要导入的文件中添加导入。我的路径一般是[package]/proto/[package].protoimport = [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&nbsp;-I./proto&nbsp;--go_out=paths=source_relative:./proto&nbsp;[package].proto

长风秋雁

我在导入时也遇到了类似的问题。已将 .protoc 文件选项包更改为以下内容。option&nbsp;go_package&nbsp;=&nbsp;"./;proto-gen/service1";第一个参数表示您要生成的代码的相对路径。您在命令中设置的相对于 --go_out 的路径。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go