协议格式正确 go_package?

Correct format of protoc go_package?

我在使用 Protocol buffers / gRPC 的 Go 中有一个现有项目。直到最近,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.

建议的link或多或少没用。但教程更明确一点:

The go_package option defines the import path of the package which will contain all the generated code for this file. The Go package name will be the last path component of the import path. For example, our example will use a package name of "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...

那么不破坏项目布局的正确做法是什么?

虽然文档没有显示,但我通过将输出目录设置为 GOPATH/src.

使其工作
protoc --go_out=plugins=grpc:$(go env GOPATH)/src authenticator.proto 

希望这可以为其他人节省时间。

添加

后上述错误消失了

option go_package = "github.com/monkrus/grpc-from0;grpc_from0";如下:

对于纯原型生成,您可以执行以下操作

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 --go-grpc_out=./gen --go-grpc_opt=paths=source_relative authenticator.proto

这只是 Google 再次就您应该如何编写和管理代码做出孤立的决定。但是,如果您深入研究了 people having similar problems 的足够问题,我发现现在可以使用上述命令。除了添加其他答案中所示的完整导入路径

option go_package = "github.com/example/path/gen;gen";

按照上面的 package 和 protoc 命令,您将在项目根目录中拥有模块名称为 github.com/example/path 的 proto 文件。然后,您的代码将被放置在您将负责创建的 gen 文件夹中。

您可能需要调整 source_relative 的输出位置以供您使用,但至少您不会以路径重复或不得不再次依赖于将代码放在 GOPATH 中而告终。

由于 this ticket 中发现的其他更改,这可能会中断。不幸的是,二进制名称完全相同,所以如果您 运行 遇到问题,请阅读该票证并尝试切换您已安装的版本,直到新的 protoc-gen-go 准备好用于生产。

你只需要添加一个 Go 选项,它会告诉你添加相对于 proto 文件的文件。

protoc --go_out=. --go_opt=paths=source_relative your_file.proto 

这将使 your_file.pb.go 与 your_file.proto

位于同一目录中

go-grpc-http-rest-microservice-tutorial 项目中的每次测试 https://medium.com/@amsokol.com/tutorial-how-to-develop-go-grpc-microservice-with-http-rest-endpoint-middleware-kubernetes-af1fff81aeb2

和源代码 https://github.com/amsokol/go-grpc-http-rest-microservice-tutorial/tree/part2

正在尝试生成 protobuf,但命令一直失败。 运行 命令本身可能会导致命令无声地失败,或者如果我尝试 运行 以 sudo 为前缀的命令,我可能会得到错误:

请使用绝对路径指定程序或确保程序在您的 PATH 系统变量中可用 --go_out:protoc-gen-go:插件失败,状态代码为 1。

我知道路径不是问题,我可以回显 $PATH 并看到 GOBIN 和 GOROOT 路径在路径中(尽管我没有明确地直接导出这些变量中的任何一个),即在 . bashrc

# export GOPATH=$HOME/go
# export GOBIN=$HOME/go/bin
# export GOROOT=/usr/local/go/bin
# export PATH=$PATH:$GOBIN:$GOROOT
export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin


$ echo $PATH
/home/tngai/.local/bin:/usr/local/lib/npm/bin:/usr/local/sbin:/usr/local/bin:/usr        /sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/include:/home/tngai/go/bin:/usr/local/go/bin

如果我输入 protoc-gen-go 它不会出错(但似乎将我带到另一个命令行,我 ctrl+c 退出),所以这不是问题

长话短说,我注意到涉及两个参数来确定生成文件的输出路径并且如果路径太长, 它可能会默默地出错.

这是有效的: 命令生成,其中前两个只是查找原型文件及其依赖原型文件的文件路径,go_out 是输出文件的前缀路径:

//cmd to run to generate protobuf and add it to the output directory
protoc --proto_path=api/proto/v1 --proto_path=third_party --go_out=plugins=grpc:./output todo-service.proto

// or below to add it under the pkg directory
protoc --proto_path=api/proto/v1 --proto_path=third_party --go_out=plugins=grpc:./ todo-service.proto

当从所需选项 go_package 合并到 proto 文件本身中提到的路径时,这是输出路径的下一部分。

//todo-service.proto file
syntax = "proto3";
package v1; //name of the folder this is in
 
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto"; 
//import "protoc-gen-swagger/options/annotations.proto";

//new required line I had to add, and which also determines output path of gen file(s)
option go_package = "./pkg/api/v1";

//...commented out the swagger generation per testing just the protobuf generation...

// Task we have to do
message ToDo {
// Unique integer identifier of the todo task
int64 id = 1;
// ...

如果您使用 syntax = "proto3";。更改grpc代码生成后必然会出现此问题processing.To修复此问题

第 1 步:在 your_file_with.proto

中通过这一行
 option go_package = "pb;gen";
   

第 2 步:假设您要在 pb 文件夹中生成所有文件 用您的可用名称替换 pb,然后在您的终端 运行 cmd window.In我的情况是我所有的原型文件都在项目目录

proto文件夹
 protoc -I=proto --go_out=. proto/*.proto

如果你的包名是user_service

user_service.proto 定义如下:

syntax = "proto3";

package user_service;

service UserService {
}

just add option go_package = "./;user_service"; under package user_service; like this :

syntax = "proto3";

package user_service;

option go_package = "./;user_service";

service UserService {
}

运行 以下内容:protoc *.proto --go_out=plugins=grpc:./user_serivce 目录中。这应该有效。

您可以简单地定义您的可选导入路径,如下所示

option go_package = ".;<Your_Import_path>";

例如我们假设包路径为“/pub”,则语句如下。

option go_package = ".;pub";

然后就可以直接执行protoc命令生成pb.go文件

protoc -I=<ABS_PATH_OUTPUT_DIR> --go_out=<ABS_PATH_PROTO_FILE>

你好,我会通过阅读文档逐步解释我是如何生成它的

创建文件夹 grpcgo

mkdir grpcgo && cd grpcgo

创建项目

go mod init projectxxx
## Download and install dependencies
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get github.com/golang/protobuf

创建文件.proto

wishlist.proto

syntax = "proto3";

package grpcgo; #Folder

option go_package = "pb;gen"; <-- Add 

message Item {
    enum ItemPriority {
        LOW = 0;
        MID = 50;
        HIGH = 100;
    }

    enum ItemStatus {
        INACTIVE = 0;
        ACTIVE = 1;
    }

    string id = 1;
    string wishListId = 2;
    string name = 3; 
    string link = 4;
    double price = 5;

    ItemPriority priority = 6;
    ItemStatus status = 7;

}

message WishList {
    enum WishListStatus {
        INACTIVE = 0;
        ACTIVE = 1;
    }

    string id = 1;
    string name = 2;
    WishListStatus status = 3;

}

编译原型

protoc -I=$PWD --go_out=$PWD $PWD/proto/*.proto

文档:

https://developers.google.com/protocol-buffers/docs/gotutorial

https://blog.friendsofgo.tech/posts/introduccion-a-grpc/

版本:

github.com/golang/protobuf v1.5.2

google.golang.org/protobuf v1.26.0

go版本go1.16.5linux/amd64

来自阿根廷的拥抱

我正在使用 Go,我想在与 *.proto 相同的文件夹中创建 *.pb.go 我所做的是在 *.proto

option go_package = "./{Your folder name}";

请注意,Your folder name 将反映在生成的 *.pb.go 包中。然后 运行:

protoc --go_out=.. *proto