首页 > 解决方案 > 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名称:

生成发生在正确的位置,但我收到了警告:

WARNING: Deprecated use of 'go_package' option without a full import path...

那么在不破坏项目布局的情况下,正确的做法是什么呢?

标签: protocol-buffersprotocgrpc-go

解决方案


对于纯原始世代,您可以执行以下操作

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 准备好用于生产。


推荐阅读