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 进行升级,但我开始收到错误
您可能会使用APIv1
与APIv2
进行重大更改。我还没有切换到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-compiler
在apt install protobuf-compiler
下安装编译器,从那时起可通过protoc
获得。
安装供protoc
使用的旧的go生成器插件:go get -u google.golang.org/protobuf/cmd/protoc-gen-go
和go 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 install
在go 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
我们使用 go
和 go-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”运行时工作正常