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

Ayu*_*pta 27 go protocol-buffers grpc protoc

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
)
Run Code Online (Sandbox Code Playgroud)

我正在运行以下命令:

protoc -I ./src/pbdefs/protos/ --go-grpc_out=. src/pbdefs/protos/*.proto
Run Code Online (Sandbox Code Playgroud)

.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.
Run Code Online (Sandbox Code Playgroud)

irz*_*zhy 29

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

下面的命令应该修复它

go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
Run Code Online (Sandbox Code Playgroud)


小智 24

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

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

您可以在此处此处了解有关新 API 的更多信息

迁移步骤:

为了运行新的代码生成,需要安装以下 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
Run Code Online (Sandbox Code Playgroud)

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

  # 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"
Run Code Online (Sandbox Code Playgroud)

  • @BerkantIpek因为“`go install` [...]现在是在模块模式下构建和安装包的推荐方法”和“不推荐使用`go get`来构建和安装包”[自Go 1.16](https ://golang.org/doc/go1.16#modules)。 (2认同)

Ayu*_*pta 13

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

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

github.com/golang/protobufprotoc根-GO的版本继续支持GRPC,将继续在可预见的将来也会如此。

编辑 29/05/2020:

根据评论中@Mark 的更新,根据github 上跟踪问题protoc-gen-go-grpc现已合并。但是,根据同一问题:

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

  • 这意味着什么。它没有回答问题。如何以及从哪里安装“protoc-gen-go-grpc”。请回答问题,然后才将其标记为答案。 (25认同)

col*_*tor 9

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

go get github.com/golang/protobuf/protoc-gen-go
Run Code Online (Sandbox Code Playgroud)

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

${HOME}/go/bin/protoc-gen-go
Run Code Online (Sandbox Code Playgroud)

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

PATH="${PATH}:${HOME}/go/bin" protoc ...
Run Code Online (Sandbox Code Playgroud)

  • 是的,使用 `go get -u google.golang.org/protobuf/cmd/protoc-gen-go` 会导致生成器切换到 v2,`go get -u github.com/golang/protobuf/protoc-gen-go ` 是 v1 (4认同)
  • 我说的是“protoc-gen-go-grpc”而不是“protoc-gen-go” (3认同)

小智 5

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