错误 "protoc-gen-go: program not found or is not executable"

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: program not found or is not executable
--go_out: protoc-gen-go: Plugin failed with status code 1."

我按照以下步骤解决了这个问题:

使用以下方法安装 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编译器。如果你在 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无法展开~

来自 GitHub 存储库,此解决方案对我有用。

Go版本为go版本go1.14.1Linux/amd64

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

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

参考:protoc-gen-go: program not found or is not executable #795

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

如果它是空的那么试试下面的方法

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

必须添加以下包:

sudo apt install protobuf-compiler

在我的例子中,我还必须添加这个:

sudo apt install golang-goprotobuf-dev

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

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

也试试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"

这对我有用。

当你在Visual Studio Code终端运行go get -u github.com/golang/protobuf/protoc-gen-go时,如果Visual Studio代码没有找到$GOPATH和$GOBIN,它会在默认用户的主目录 /home/$username/go{/bin}

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

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

然后重启电脑。

使用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 like this 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库
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{}

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

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

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

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

第 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"

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

  1. git 克隆 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 1.17+

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

Starting in Go 1.17, installing executables with go get is deprecated. go install may be used instead.

~/.bashrc

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

安装

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

go: downloading google.golang.org/protobuf v1.27.1

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

go: downloading google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0

go: downloading google.golang.org/grpc v1.44.0

file.go

protoc --go-grpc_out=. *.proto

环境