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

Posted

技术标签:

【中文标题】protoc-gen-go-grpc:程序未找到或不可执行【英文标题】:protoc-gen-go-grpc: program not found or is not executable 【发布时间】:2020-06-20 01:32:37 【问题描述】:

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

去.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.

【问题讨论】:

【参考方案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 ...

【讨论】:

我说的是protoc-gen-go-grpc而不是protoc-gen-go 我明白了,但我已经用这个精确的设置编译了 protobuf 和 grpc。我怀疑您的插件和/或编译器安装有问题。您是安装了预编译的protoc 编译器还是自己构建的? 我自己构建了它,它运行良好。我正在尝试根据this 进行升级,但我开始收到错误 您可能会使用APIv1APIv2 进行重大更改。我还没有切换到APIv2。也许使用较新的(不是 github)导入路径 google.golang.org/protobuf 是的,使用go get -u google.golang.org/protobuf/cmd/protoc-gen-go会导致生成器切换到v2,go get -u github.com/golang/protobuf/protoc-gen-go是v1【参考方案2】:

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

v1.20 protoc-gen-go 不支持生成 gRPC 服务定义。未来,gRPC 服务生成将由 Go gRPC 项目提供的新 protoc-gen-go-grpc 插件支持。

github.com/golang/protobuf 版本的 protoc-gen-go 继续支持 gRPC,并将在可预见的未来继续支持。

2020 年 5 月 29 日编辑:

根据 @Mark 在 cmets 中的更新,根据 Tracking issue on github,protoc-gen-go-grpc 现在已被合并。但是,根据同样的问题:

即使合并,它也未发布 (v0.0) 并且可能会发生变化。我们确实计划添加一个要求,即未实现的服务实现包含在所有已注册的服务中,并按照@neild 的建议,以命令行参数的形式提供一个逃生舱口。

【讨论】:

这是什么意思。它没有回答这个问题。如何以及从何处安装protoc-gen-go-grpc。请回答问题,然后才将其标记为答案。 @IshanKhare protoc-gen-go-grpc 尚未发布。 protoc-gen-go-grpc 现已合并。 @Mark 感谢您的更新。我在答案中添加了相同的内容。【参考方案3】:

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

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

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

【讨论】:

它仍然未发布,可能会发生变化并缺少一些功能。 @AyushGupta 你有解决方法吗?我现在不得不添加这个,到目前为止它似乎还可以。可能只需要跟踪任何变化 我可能会坚持使用旧版本,直到稳定的 GA 版本发布 旧版本是什么? @tylerthemiler 坚持使用protoc-gen-go 而不是升级到protoc-gen-go-grpc【参考方案4】:

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

由于 APIv2 不向后兼容 APIv1,因此我们需要针对新 API 调整所有 Golang 代码。

您可以详细了解新 API here 和 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"

【讨论】:

go get 已经在go/bin 安装了二进制文件。那么为什么要go install呢? @BerkantIpek 因为“go install [...] 现在是在模块模式下构建和安装包的推荐方式”和“不推荐使用 go get 构建和安装包”@ 987654323@.【参考方案5】:

对于所有不太了解该主题的人(如我)并且仍然难以找出可行的解决方案,这里有一个循序渐进的方法:

    apt install protobuf-compilerapt install protobuf-compiler 下安装编译器,从那时起可通过protoc 获得。 安装供protoc使用的旧的go生成器插件: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 添加它。 要告诉该插件不仅要生成 protobuf 消息类型信息,还要生成 grcp 方法,请使用类似 protoc --go_out=plugins=grpc:my/relative/output/path ./my_file.proto 的命令。

一旦你弄清楚了这一点,看起来有点微不足道,但是如果你不了解该主题并且只有很少的关于 go 文件生成器生成器和 grcp 扩展应该如何工作的信息,那么很难弄清楚这一点在一起。

【讨论】:

为什么go installgo get 之后? @Berkant Ipek 你说得对,应该是go get -u【参考方案6】:

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

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

【讨论】:

【参考方案7】:

我用这个命令解决:

protoc 计算器/calculatorpb/calculator.proto --go-grpc_out=. 协议-I=。 --go_out=。计算器/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) 

【讨论】:

【参考方案8】:

我必须安装所有这些:

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

【讨论】:

【参考方案9】:

使用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 存根的示例,假设您位于存储库的根目录中,并且您的 proto 文件位于名为 proto 的目录中:

$ 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/。另外,你可以参考我的简单的hello world程序,它使用了gRPC-Gateway,即https://github.com/iamrajiv/helloworld-grpc-gateway。

【讨论】:

【参考方案10】:

在这里分享我有用的 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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

以上是关于protoc-gen-go-grpc:程序未找到或不可执行的主要内容,如果未能解决你的问题,请参考以下文章

MSTest Visual Studio 2015:未找到测试容器直接或间接引用的程序集或模块“xxxxxxx”

直接或从 Makefile 执行 Python 程序时未找到模块,但在使用“python”运行时工作正常

预定义的类型“System.Object”未定义或未导入

未找到 terraform kubectl 提供程序

Node.js socket.io.js 未找到或 io 未定义

把vb打包成安装程序后安装是提示路径或文件未找到,是怎那么回事