繁体   English   中英

错误“protoc-gen-go:程序未找到或不可执行”

[英]Error "protoc-gen-go: program not found or is not executable"

我正在尝试使用 Go gRPC构建示例应用程序,但我无法使用“protoc”生成代码

我已经使用以下方法安装了所需的库和 Go 包:

  1. go get -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。”

有两种方法可以安装 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无法扩展~

我按照以下步骤解决了它:

使用以下命令安装 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
  3. 运行source ~/.bash_profile

参考: 无法构建 protobuf 去端点

Tannisha Hill 表示必须添加以下软件包:

sudo apt install protobuf-compiler

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

sudo apt install golang-goprotobuf-dev

从 GitHub 存储库中,这个解决方案对我有用。

Go 版本是go 版本 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

Ref.: protoc-gen-go: program not found or is not executable #795

还可以尝试grpc.io 文档中的官方解决方案。

协议编译器的 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"

这对我有用。

去 1.17+

来自https://go.dev/doc/go-get-install-deprecation

从 Go 1.17 开始,不推荐使用 go get 安装可执行文件。 可以使用 go install 代替。

~/.bashrc

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

安装

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

去:下载 google.golang.org/protobuf v1.27.1

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

去:下载google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0

去:下载google.golang.org/grpc v1.44.0

文件.go

protoc --go-grpc_out=. *.proto

环境

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

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

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

使用go get下载以下包:

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

设置GOPATHGOROOT ,请按照以下步骤操作:

但是,首先,运行go env

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

如果您看到GOPATH为空:

在我的情况下,为 Go 项目在计算机上的任何位置创建任何目录: ~/GO_PROJECTS 然后export GOPATH=~/GO_PROJECTS

如果您看到GOROOT为空:

运行which go (在我的计算机上:/usr/local/bin/go)然后编辑您的~/.zshrc文件以添加以下行 export 像这样export GOROOT=/usr/local/go

您还可以编辑~/.zshrc文件以添加以下行来设置GOPATHGOROOT

如果您已经从原始 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

我尝试了多种解决方案,但最后我发现 Go 环境变量才是真正的罪魁祸首。

如果您使用的是 Linux,请将这些变量添加到您的.bashrc.bash_profile文件中。

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

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

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

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

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

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

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

然后重新启动计算机。

步骤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"

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

使用安装 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 :: The import path must contain at least one forward slash ('/') character。 要解决此问题,请更改选项中的路径

syntax = "proto3";

package greet;

option go_package="./greet/greetpb";

service GreetService{}

注意:在您的终端上切换到 root 权限并按照以下步骤操作。 这让我摆脱了困境

  1. git clone https://github.com/micro/protoc-gen-micro.git /usr/local/go/bin/src/github.com/micro/protoc-gen-micro
  2. cd src/github.com/micro/protoc-gen-micro
  3. 去建造
  4. cp protoc-gen-micro /bin

快乐编码!

安装 Go 后,使用 go get 下载以下包:

$ 去获取 google.golang.org/protobuf/cmd/protoc-gen-go

$ 去获取 google.golang.org/grpc/cmd/protoc-gen-go-grpc

您看到此消息的原因是因为 Go 无法访问可执行文件。 Go 在调用时查找 ~/go/bin 以查找可执行文件。 让我们检查一下您的 PATH 变量是否具有可执行文件。 但首先,让我们看看错误。

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

为了解决这个问题,我们应该首先检查 ~/go/bin 是否在我们的路径中。

echo $PATH

检查结果以查看 ~/go/bin 是否在您的路径中。

如果没有,让我们将它添加到我们的路径中:

export PATH=$PATH:/$GO_PATH/bin

如果安装了 protoc-gen-go,现在一切都应该工作了。

如果没有,请安装 protoc-gen-go。

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

以上都不适合我。 事实证明,您必须将 go 转到此页面,然后在解压缩到您的 GOPATH 时下载适合您平台的文件。 例如这个 protoc-21.5-osx-x86_64.zip 用于 Intel macOS 或这个用于 linux 64 位 protoc-21.5-linux-x86_64.ZADCDBD79A8D8417F22A

它对我有用:

检查 protoc-gen-go 在你的系统上安装,如果它没有安装然后在你的系统上安装它。 对于苹果 *

brew install protoc-gen-go

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM