【问题标题】:protoc-gen-go: program not found or is not executableprotoc-gen-go:程序未找到或不可执行
【发布时间】:2020-01-02 04:19:54
【问题描述】:

我正在尝试使用 go grpc 构建示例应用,但无法使用“protoc”生成代码

已使用以下工具安装了所需的库/go 包:

  1. 去获取 -u google.golang.org/grpc
  2. go get -u github.com/golang/protobuf/protoc-gen-go

也尝试过设置路径,但没有成功。

示例“原型”文件:

syntax = "proto3";

package greet;
option go_package="greetpb";

service GreetService{}

错误信息: “protoc-gen-go:程序未找到或不可执行 --go_out: protoc-gen-go: 插件失败,状态码为 1。”

【问题讨论】:

标签: go protocol-buffers grpc proto protoc


【解决方案1】:

protobuf 编译器有两种安装方式,如果你在 Ubuntu 上可以使用这个,

sudo apt install protobuf-compiler

那当然是标准的方式了,

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

这里只是添加路径。假设你在安装 Go 时这样做了,

echo 'export GOPATH=$HOME/Go' >> $HOME/.bashrc
source $HOME/.bashrc

现在你可以扩展它了,

echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.bashrc
source $HOME/.bashrc

奇怪的是protoc 无法展开~。

【讨论】:

    【解决方案2】:

    按照以下步骤解决:

    使用以下命令安装 go 库: go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

    1. 运行vim ~/.bash_profile
    2. 添加:
    export GO_PATH=~/go
    export PATH=$PATH:/$GO_PATH/bin
    
    1. 运行source ~/.bash_profile

    参考:Unable to build protobuf to go endpoint

    【讨论】:

    • 这不起作用,因为protoc 编译器无法解析~
    • 顺便说一句,你真的应该使用.bashrc 而不是.bash_profile
    • @SoumasishGoswami 你能解释一下为什么使用 .bashrc 而不是 .bash_profile 吗?
    • @TannishaHill .bash_profile 或更好的是 .profile 更适合您导出的环境变量,因为它通常只执行一次,由登录 shell 执行。 .bashrc 由所有交互式 shell 执行,因此每次手动启动子 shell 时,您最终都会轻松地重新导出环境变量。
    【解决方案3】:

    他们在上面评论说必须添加以下包

    sudo apt install protobuf-compiler
    

    就我而言,我还必须添加这个..

    sudo apt install golang-goprotobuf-dev
    

    【讨论】:

      【解决方案4】:

      从 github repo 这个解决方案对我有用。

      Go 版本是go version go1.14.1 linux/amd64

      将此添加到 .bashrc 并获取它。

      export GOROOT=/usr/local/go
      export GOPATH=$HOME/go
      export GOBIN=$GOPATH/bin
      export PATH=$PATH:$GOROOT:$GOPATH:$GOBIN
      

      https://github.com/golang/protobuf/issues/795

      【讨论】:

        【解决方案5】:

        以防万一其他人仍然面临这个问题,请尝试grpc.io documentation的官方解决方案

        协议编译器的 Go 插件:

        使用以下命令为 Go 安装协议编译器插件:

        $ export GO111MODULE=on  # Enable module mode
        
        $ go get google.golang.org/protobuf/cmd/protoc-gen-go \
                 google.golang.org/grpc/cmd/protoc-gen-go-grpc
        

        更新您的 PATH 以便 protoc 编译器可以找到插件:

        $ export PATH="$PATH:$(go env GOPATH)/bin"
        

        这对我有用。

        【讨论】:

          【解决方案6】:

          确保您的 GOBIN 设置在 PATH 变量中。否则,您可能会遇到此问题。通过运行go env 检查GOBIN 路径并确认GOBIN 不为空。

          如果它是空的,那么尝试如下

          export GOPATH=$HOME/go
          export PATH=$PATH:$GOPATH/bin
          protoc --go_out=plugins=grpc:. *.proto
          

          【讨论】:

          • 完全正确,正如docs 状态:"设置$GOBIN 环境变量以更改安装位置。它必须在您的$PATH 中,协议缓冲区编译器才能找到它。"
          【解决方案7】:

          使用go get下载以下包:

          $ go get google.golang.org/protobuf/cmd/protoc-gen-go
          $ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
          

          要设置 GOPATH 和 GOROOT,请按照以下步骤操作:

          但是,首先,运行go env。

          如果你看到 Go 没有安装,你可以通过 Homebrew 安装它。如果您看到输出,则说明您的 Go 已安装。它向您显示所有已设置和未设置的环境。

          如果您看到 GOPATH 为空:

          在您的计算机上为 Go 项目创建任何目录:~/GO_PROJECTS 然后export GOPATH=~/GO_PROJECTS。

          如果您看到 GOROOT 为空:

          运行which go(在我的电脑上:/usr/local/bin/go) 然后编辑您的~/.zshrc 文件以添加以下行导出,如export GOROOT=/usr/local/go。

          您还可以编辑您的~/.zshrc 文件以添加以下行来设置GOPATH 和GOROOT:

          如果你已经从原始 pkg 安装了 Go,请从 https://golang.org/doc/install 下载。

          export GOPATH=$HOME/dev/go-workspace
          export GOROOT=/usr/local/go
          export PATH=$PATH:$GOPATH/bin
          export PATH=$PATH:$GOROOT/bin
          

          如果你使用 Homebrew 安装了 Go。

          export GOPATH=$HOME/dev/go-workspace
          export GOROOT=/usr/local/opt/go/libexec
          export PATH=$PATH:$GOPATH/bin
          export PATH=$PATH:$GOROOT/bin
          

          保存并退出您的编辑器。然后,获取您的~/.zshrc。

          source ~/.zshrc
          

          【讨论】:

            【解决方案8】:

            我尝试了多种解决方案,但最后发现 go env 变量才是真正的罪魁祸首。 如果您使用的是 linux,请将这些变量添加到您的 bashrc 或 bashprofile 文件中。

            export GOROOT=/usr/local/go
            export GOPATH=$HOME/go
            export GOBIN=$GOPATH/bin
            export PATH=$PATH:$GOROOT:$GOPATH:$GOBIN
            

            并且不要忘记在编辑后获取它。 (例如$source ~/.bashrc)

            【讨论】:

            • 在我将 /home/username/go 和 /home/username/go/bin 添加到 PATH (Go 1.16)后为我工作。是否设置了 env 变量 $GOPATH 和 $GOBIN 似乎没有区别(如果我错了,请有人纠正我)。
            【解决方案9】:

            当您在 vscode 终端中运行 go get -u github.com/golang/protobuf/protoc-gen-go 时。如果 vscode 没有找到 $GOPATH & $GOBIN ,它将把包安装到默认用户的主目录 /home/$username/go{/bin}

            解决方案是将bin和pkg文件夹中的所有文件移动到您当前的go路径(/usr/local/go{/bin}),go路径包含bin文件夹中的go文件 并将这一行添加到 .bashrc 文件的末尾

            export GOPATH=/usr/local/go:$PATH
            export GOBIN=/usr/local/go/bin:$PATH
            

            然后重启电脑

            【讨论】:

              【解决方案10】:

              如果有人现在面临同样的问题。

              使用安装go库

              go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
              

              确保设置了 GOPATH 变量 就我而言,我创建了一个名为 gocode 的文件夹,但如果您的代码位于另一个文件夹中,则必须更改它

              export GOPATH=$HOME/gocode
              export Path=$Path:$GOPATH/bin
              

              执行此步骤后,我发现另一个错误 protoc-gen-go failed :: 导入路径必须包含至少一个正斜杠 ('/') 字符。要解决这个问题,请更改选项中的路径

              syntax = "proto3";
              
              package greet;
              
              option go_package="./greet/greetpb";
              
              service GreetService{}
              

              【讨论】:

                【解决方案11】:

                第 1 步:

                sudo apt install protobuf-compiler
                

                第 2 步:

                go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
                

                第 3 步:

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

                更新您的 PATH 以便 protoc 编译器可以找到插件:

                export PATH="$PATH:$(go env GOPATH)/bin"
                

                【讨论】:

                  【解决方案12】:

                  许多其他响应解决了路径问题,但如果未安装,您可以使用以下命令安装它:

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

                  【讨论】:

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