protocol-buffers - protoc go_package 的正确格式?
问题描述
我在 Go 中有一个现有项目,我正在使用协议缓冲区/gRPC。直到最近,该go_package
选项都是可选的,并且生成的 Go 包名称将与 proto 包名称相同。
该文件位于项目根目录中。生成的代码文件 ( authenticator.pb.go
) 位于同一位置。原型文件:
syntax = "proto3";
package authenticator;
service Authenticator {...}
生成命令指定我要在同一目录中输出:
protoc --go_out=plugins=grpc:. authenticator.proto
今天我拉出了新版本的协议缓冲区编译器和github.com/golang/protobuf/protoc-gen-go
. 第一次运行时收到警告:
WARNING: Missing 'go_package' option in "authenticator.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
建议的链接或多或少没用。但本教程更明确一点:
go_package 选项定义包的导入路径,该路径将包含此文件的所有生成代码。Go 包名称将是导入路径的最后一个路径组件。例如,我们的示例将使用包名“tutorialpb”。
option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";
将此选项添加到 proto 文件并重新运行命令后,输出将在此路径中结束,相对于项目根目录。就像是:
$GOPATH/src/github.com/<org>/authenticator/github.com/<org>/authenticator/authenticator.pb.go
我尝试了以下替代go_package
名称:
.
authenticator
生成发生在正确的位置,但我收到了警告:
WARNING: Deprecated use of 'go_package' option without a full import path...
那么在不破坏项目布局的情况下,正确的做法是什么呢?
解决方案
对于纯原始世代,您可以执行以下操作
protoc --go_out=paths=source_relative:./gen -I. authenticator.proto
或者为 grpc 生成以下可以使用
protoc --go_out=plugins=grpc:./gen --go_opt=paths=source_relative authenticator.proto
如果失败,您可能拥有更新版本的 protoc,需要改用以下命令。
protoc --go-grpc_out=./gen --go-grpc_opt=paths=source_relative authenticator.proto
这只是谷歌再次就您应该如何编写和管理代码做出孤立的决定。但是,如果您深入了解有类似问题的人的问题,我发现现在可以使用上述命令。除了添加完整的导入路径,如其他答案所示
option go_package = "github.com/example/path/gen;gen";
按照上面的 package 和 protoc 命令,您将在项目根目录中拥有 proto 文件,其模块名称为 github.com/example/path。然后,您的代码将被放置在您将负责创建的 gen 文件夹中。
您可能需要调整 source_relative 的输出位置以供您使用,但至少您最终不会出现路径重复或不得不再次依赖将代码放置在 GOPATH 中。
由于此票证中发现的其他更改,这可能会中断。不幸的是,二进制名称完全相同,所以如果您遇到问题,请阅读该票并尝试切换您已安装的版本,直到新的 protoc-gen-go 准备好用于生产。
推荐阅读
- javascript - 如何在javascript中禁用按钮上启用工具提示?
- mysql - 更新时重复输入
- powershell - Powershell foreach循环读取csv,操作并写入txt
- firebase - 无法将我的数据上传到 firebase
- tensorflow - tensorlfow的model.fit()方法中steps_per_epoch和batch size有什么区别?
- javascript - 如何获取完整日历的开始时间和结束时间
- string - 预期 &str 发现 char 生锈?
- python-3.x - Synology DS218j 中的 Python 模块
- javascript - 如何修复'Date []'类型的参数不能分配给反应中'(prevState:undefined)类型的参数
- python - 根据列表类型列中的项目数创建熊猫重复行