我在 Go 中有一个现有项目,我正在使用协议缓冲区/gRPC。直到最近,该go_package选项还是可选的,并且生成的 Go 包名称将与 proto 包名称相同。
该文件位于项目根目录中。生成的代码文件 ( authenticator.pb.go) 位于同一位置。原型文件:
syntax = "proto3";
package authenticator;
service Authenticator {...}
Run Code Online (Sandbox Code Playgroud)
生成命令指定我要在同一目录中输出:
protoc --go_out=plugins=grpc:. authenticator.proto
Run Code Online (Sandbox Code Playgroud)
今天我拉取了新版本的协议缓冲区编译器和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.
Run Code Online (Sandbox Code Playgroud)
建议的链接或多或少没用。但是教程更明确一点:
go_package 选项定义包的导入路径,该路径将包含此文件的所有生成代码。Go 包名称将是导入路径的最后一个路径组件。例如,我们的示例将使用包名称“tutorialpb”。
Run Code Online (Sandbox Code Playgroud)option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";
将此选项添加到 proto 文件并重新运行命令后,输出最终位于此路径中,相对于项目根目录。就像是:
$GOPATH/src/github.com/<org>/authenticator/github.com/<org>/authenticator/authenticator.pb.go
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下替代go_package名称:
.authenticator生成发生在正确的位置,但我得到了警告:
WARNING: …Run Code Online (Sandbox Code Playgroud) 我有包含以下内容的简单原型文件。
\nsyntax="proto3";\n\npackage main;\n\nmessage Person {\n string name = 1;\n int32 age = 2; \n}\nRun Code Online (Sandbox Code Playgroud)\n我正在尝试使用 protoc 为其生成 go 代码。我跑:
\nprotoc --go_out=. simple.proto\nRun Code Online (Sandbox Code Playgroud)\n我收到以下错误:
\nprotoc-gen-go: unable to determine Go import path for "simple.proto"\n\nPlease specify either:\n \xe2\x80\xa2 a "go_package" option in the .proto source file, or\n \xe2\x80\xa2 a "M" argument on the command line.\nRun Code Online (Sandbox Code Playgroud)\nmain.go,go.mod并且simple.proto位于同一文件夹中。和protoc都protoc-gen-go在 PATH 环境中定义。