protoc-gen-go-grpc:程序未找到或不可执行

protoc-gen-go-grpc: program not found or is not executable

go version:go版本go1.14linux/amd64

go.mod

module [redacted]

go 1.14

require (
    github.com/golang/protobuf v1.4.0-rc.2
    google.golang.org/grpc v1.27.1
    google.golang.org/protobuf v1.20.0 // indirect
)

我是运行以下命令:

protoc -I ./src/pbdefs/protos/ --go-grpc_out=. src/pbdefs/protos/*.proto

.proto 个文件生成我的 GRPC 输出文件,我收到一个错误

protoc-gen-go-grpc: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
--go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.

如果你还没有完成,那么你需要像这样安装 protoc-gen-go 插件:

go get github.com/golang/protobuf/protoc-gen-go

这会将插件(如果您的 GOPATH${HOME}/go)安装到:

${HOME}/go/bin/protoc-gen-go

然后当 运行 protoc 时,要么更新您的路径,要么像这样动态设置它:

PATH="${PATH}:${HOME}/go/bin" protoc ...

好的,刚刚发现,按照https://github.com/protocolbuffers/protobuf-go/releases/tag/v1.20.0

The v1.20 protoc-gen-go does not support generating gRPC service definitions. In the future, gRPC service generation will be supported by a new protoc-gen-go-grpc plugin provided by the Go gRPC project.

The github.com/golang/protobuf version of protoc-gen-go continues to support gRPC and will continue to do so for the foreseeable future.

编辑 29/05/2020:

根据评论中@Mark 的更新,根据 Tracking issue on githubprotoc-gen-go-grpc 现已合并。然而,根据同样的问题:

Even with this merged, it is unreleased (v0.0) and subject to change. We do plan to add a requirement that the Unimplemented service implementation be included in all registered services, with an escape hatch in the form of a command-line arg as suggested by @neild.

缺少的插件已在 https://github.com/grpc/grpc-go 实现。

下面的命令应该可以修复它

go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

Golang Protobuf 发布了新版本的 Go 协议缓冲区,他们将其称为 APIv2。

因为 APIv2 不向后兼容 APIv1,因此我们需要为新的 API.

调整所有 Golang 代码

您可以了解有关新功能的更多信息APIhere and here

迁移步骤:

为了运行新的代码生成需要安装以下 gRPC gen 插件:

go get -u google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go

go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

然后使用下面的命令生成代码。

  # generate the messages
 protoc --go_out="$GO_GEN_PATH" -I "$dependecies" "$proto"

 # generate the services
 protoc --go-grpc_out="$GO_GEN_PATH" -I "$dependecies" "$proto"

对于那些不太了解这个话题(比如我)并且仍然难以找到有效解决方案的人,这里有一个 step-by-step 方法:

  1. apt install protobuf-compilerapt install protobuf-compiler 下安装编译器,从那时起通过 protoc 可用。
  2. 安装旧的 go 生成器插件以供 protoc 使用:go get -u google.golang.org/protobuf/cmd/protoc-gen-gogo install google.golang.org/protobuf/cmd/protoc-gen-go。另外,确保安装的插件可以在 $PATH 中找到,或者如果需要的话用 export PATH=$PATH:$(go env GOPATH)/bin 添加它。
  3. 要告诉该插件不仅要生成 protobuf 消息类型信息,还要生成 grcp 方法,请使用像 protoc --go_out=plugins=grpc:my/relative/output/path ./my_file.proto.
  4. 这样的命令

一旦你弄明白了,看起来有点微不足道,但如果你不参与那个主题,并且只知道关于 go 文件生成器生成器和 grcp 扩展应该如何的稀缺信息,就很难弄清楚一起工作。

我一直在寻找一个好的答案,最后它对我有用:

protoc --go-grpc_out=. file_path/file_name*.proto 

我用这个命令解决了:

  • protoc calculator/calculatorpb/calculator.proto --go-grpc_out=.
  • 协议-I=。 --go_out=。 calculator/calculatorpb/calculator.proto

生成calculator_pb.go和calculator_grpc.go

syntax = "proto3";

package calculator;
option go_package = "calculator/calculatorpb";

message SumRequest {
  int32 first_number = 1;
  int32 second_number = 2;
}

message SumResponse {
  int32 sum_result =1 ;
}

service CalculatorService{
  rpc Sum(SumRequest) returns(SumResponse) {}
}

我必须安装所有这些:

go install \
   github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \
   github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \
   google.golang.org/protobuf/cmd/protoc-gen-go \
   google.golang.org/grpc/cmd/protoc-gen-go-grpc

使用go get下载以下软件包:

$ go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
$ go get google.golang.org/protobuf/cmd/protoc-gen-go
$ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

这会安装我们生成存根所需的 protoc 生成器插件。确保将 $GOPATH/bin 添加到您的 $PATH 以便通过 go get 安装的可执行文件在您的 $PATH.

上可用

这是一个 protoc 命令生成 Go 存根的示例,假设您位于存储库的根目录下,并且您的原型文件位于名为 [=19= 的目录中]:

$ protoc -I ./proto \
   --go_out ./proto --go_opt paths=source_relative \
   --go-grpc_out ./proto --go-grpc_opt paths=source_relative \
   ./proto/helloworld/hello_world.proto

我们使用 gogo-grpc 插件来生成 Go 类型和 gRPC 服务定义。我们正在输出相对于 proto 文件夹的生成文件,我们正在使用 paths=source_relative 选项,这意味着生成的文件将出现在与源 .proto 相同的目录中文件。

您应该查看有关 gRPC-Gateway 的教程系列,即 https://grpc-ecosystem.github.io/grpc-gateway/docs/tutorials/. Also, you can refer to my simple hello world program, which uses gRPC-Gateway, i.e., https://github.com/iamrajiv/helloworld-grpc-gateway

在这里分享我有用的 bash 命令:

go get -u google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go

go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

protoc --proto_path=./proto ./proto/*.proto --plugin=$(go env GOPATH)/bin/protoc-gen-go-grpc --go-grpc_out=./pb 

protoc --proto_path=./proto ./proto/*.proto --plugin=$(go env GOPATH)/bin/protoc-gen-go --go_out=./pb

您还可以使用https://github.com/storyicon/powerproto一键安装所有protoc相关的依赖(包括protoc-gen-go-grpc)并进行版本控制。

更新您的 PATH 以便 protoc 编译器可以找到插件: export PATH="$PATH:$(go env GOPATH)/bin"