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 github,protoc-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 方法:
apt install protobuf-compiler
在 apt install protobuf-compiler
下安装编译器,从那时起通过 protoc
可用。
- 安装旧的 go 生成器插件以供
protoc
使用: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 扩展应该如何的稀缺信息,就很难弄清楚一起工作。
我一直在寻找一个好的答案,最后它对我有用:
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
我们使用 go
和 go-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"
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 github,protoc-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 方法:
apt install protobuf-compiler
在apt install protobuf-compiler
下安装编译器,从那时起通过protoc
可用。- 安装旧的 go 生成器插件以供
protoc
使用: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 扩展应该如何的稀缺信息,就很难弄清楚一起工作。
我一直在寻找一个好的答案,最后它对我有用:
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
我们使用 go
和 go-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"