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

protoc Go Package 命令本地覆盖?

protoc Go Package 命令本地覆盖?

Go
冉冉说 2022-09-05 17:24:16
按照官方 gRPC 网站上的快速入门 gRPC Go 指南,它有一个步骤,要求用户使用此命令重新编译更新的 .proto 文件:$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto我对“人类编写”的Go代码如何使用新编译的protobuf文件感到有些困惑。在示例“人类编写”Go代码中,他们使用以下导入来引用原型buf代码:pb "google.golang.org/grpc/examples/helloworld/helloworld"protoc不会更新此程序包,而是更新运行命令的同一目录中的程序包。该命令如何确保“人类编写”的 Go 代码使用新编译的 protobuf 代码?helloworld/helloworld.protoprotoc
查看完整描述

1 回答

?
神不在的星期二

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

我发现这是Protobufs(和gRPC)中更令人困惑的方面之一。

我认为正在解决的问题是Protobufs需要:

  1. 允许名称间距以限定服务范围|消息的范围,例如 DNS 域

  2. 支持无数的编程语言(以不同的方式实现命名空间)。

protoc具有允许(重新)映射的选项,例如,使用protobuf选项将protobuf的包映射到特定于语言的命名空间,例如)。请参阅 Golang 的 Go 生成代码v1/apigo_package

使用Go Modules时,这稍微复杂一些,但总而言之,您遇到的可能是上述某些(意外的)组合,其中示例代码假定一个模块名称,并且基于另一个模块名称的假设进行构建。protoc

TL;DR 更新代码的模块引用以反映正确生成的路径。如果生成代码位于错误的位置,则只需将其移动到正确的子目录(路径),最好更新命令以将文件生成到正确的目录。pbprotoc

something.proto:


syntax = "proto3";


package v1alpha1;


option go_package = "github.com/me/my-protos;v1alpha1";

NOTE 将原型包别名为我想要引用的内容,如 Golang 中所示。go_packagev1alpha1github.com/me/my-protos


然后我生成:


MODULE="github.com/me/my-protos"

protoc \

--proto_path=. \

--go_out=./api/v1alpha1 \

--go_opt=module=${MODULE} \

--go-grpc_out=./api/v1alpha1 \

--go-grpc_opt=module=${MODULE} \

./something.proto

注意此示例也生成 gRPC 代码。它避免了(! 为生成的代码创建路径,因为我正在该存储库中生成源代码。我只想要创建文件的相对路径。protocgithub.com/me/my-protos./api/v1alpha


这会产生:


my-protos

├── something.proto

├── api

│   └── v1alpha1

│       ├── something_grpc.pb.go

│       └── something.pb.go

├── go.mod

├── go.sum

└── README.md

我可以导入:


import (

    pb "github.com/me/my-protos/api/v1alpha1"

)

注意从其他存储库中,我现在可以访问我的 protos 存储库,将重现和生成的位置结合起来,以提供所需的路径。github.com/me/my-project/api/v1alpha1


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号