【问题标题】:protoc-gen-go-grpc: program not found or is not executableprotoc-gen-go-grpc:程序未找到或不可执行
【发布时间】:2023-03-12 08:45:01
【问题描述】:

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.

【问题讨论】:

    标签: go protocol-buffers grpc protoc


    【解决方案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 githubprotoc-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 herehere

    迁移步骤:

    为了运行新的代码生成,需要安装以下 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】:

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

    1. apt install protobuf-compilerapt install protobuf-compiler 下安装编译器,从那时起可通过protoc 获得。
    2. 安装供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 添加它。
    3. 要告诉该插件不仅要生成 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"

                【讨论】:

                  猜你喜欢
                  • 2020-01-02
                  • 2022-08-16
                  • 2020-08-05
                  • 2022-07-07
                  • 2021-02-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多