为了账号安全,请及时绑定邮箱和手机立即绑定

Golang proto 文件管理和导入

Golang proto 文件管理和导入

Go
凤凰求蛊 2023-08-14 15:13:20
我有 2 个 grpc 服务(service1和service2)相互交互,在某些情况下,rpc 响应service1将由 中定义的结构组成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.goservice1需要导入模型定义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我现在花了几个小时搜索如何正确导入另一个原始文件,我似乎找不到任何解决方案
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

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

这就是我为源树所做的:我有一个类似的相互导入的原始文件树。如果您的模块名为 ,github.com/myapp则运行protocwith --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>,因此您也可以尝试一下。


查看完整回答
反对 回复 2023-08-14
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

在 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


查看完整回答
反对 回复 2023-08-14
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我在导入时也遇到了类似的问题。已使用以下内容更改了 .protoc 文件选项包。

option go_package = "./;proto-gen/service1";
  1. 第一个参数表示要生成的代码的相对路径。

  2. 您在命令中设置的相对于 --go_out 的路径。


查看完整回答
反对 回复 2023-08-14
  • 3 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信