Error "protoc-gen-go: program not found or is not executable"
GoProtocol BuffersGrpcProtoProtocGo Problem Overview
I am trying to build a sample application with Go gRPC, but I am unable to generate the code using "protoc"
I have installed the required libraries and Go packages using:
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
I have tried setting the path as well, but no luck.
Sample "proto" file:
syntax = "proto3";
package greet;
option go_package="greetpb";
service GreetService{}
Error message:
> "protoc-gen-go: program not found or is not executable
--go_out: protoc-gen-go: Plugin failed with status code 1."
Go Solutions
Solution 1 - Go
There are two ways to install the protobuf compiler. If you're on Ubuntu you can use this:
sudo apt install protobuf-compiler
Then of course there's the standard way:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
Here forward it's just adding the path. Assuming when you installed Go you did this,
echo 'export GOPATH=$HOME/Go' >> $HOME/.bashrc
source $HOME/.bashrc
Now you can just extend this:
echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.bashrc
source $HOME/.bashrc
Strangely protoc
can't expand ~
.
Solution 2 - Go
I resolved it by following these steps:
Install the Go library using:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
- Run
vim ~/.bash_profile
- Add:
export GO_PATH=~/go export PATH=$PATH:/$GO_PATH/bin
- Run
source ~/.bash_profile
Reference: https://stackoverflow.com/questions/28099004/unable-to-build-protobuf-to-go-endpoint
Solution 3 - Go
Tannisha Hill indicated that the following package had to be added:
sudo apt install protobuf-compiler
In my case, I also had to add this one:
sudo apt install golang-goprotobuf-dev
Solution 4 - Go
From the GitHub repository, this solution has worked for me.
The Go version is go version go1.14.1 Linux/amd64
Add this to .bashrc
and source it.
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
Solution 5 - Go
Also try the official solution from grpc.io documentation.
Go plugins for the protocol compiler:
Install the protocol compiler plugins for Go using the following commands:
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
Update your PATH so that the protoc compiler can find the plugins:
export PATH="$PATH:$(go env GOPATH)/bin"
This worked for me.
Solution 6 - Go
Make sure your GOBIN is set in the PATH
variable. Otherwise, you may encounter this problem. Check GOBIN
path by running go env
and confirm GOBIN
is not empty.
If it is empty then try like below
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
protoc --go_out=plugins=grpc:. *.proto
Solution 7 - Go
Use go get
to download the following packages:
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
For setting GOPATH
and GOROOT
, follow the below procedure:
But, first, run go env
.
If you see that the Go is not installed, you can install it via Homebrew. If you see the output, then your Go is installed. It shows you all the environments that are set and are not.
If you see empty for GOPATH
:
Create any directory anywhere on your computer for Go projects in my case: ~/GO_PROJECTS then export GOPATH=~/GO_PROJECTS
.
If you see empty for GOROOT
:
Run which go
(on my computer: /usr/local/bin/go)
then edit your ~/.zshrc
file to add the following line export like this export GOROOT=/usr/local/go
.
You can also edit your ~/.zshrc
file to add the following line to set up the GOPATH
and GOROOT
:
If you have installed Go from the original pkg, download from 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
If you have installed Go using Homebrew.
export GOPATH=$HOME/dev/go-workspace
export GOROOT=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
Save and exit your editor. Then, source your ~/.zshrc
.
source ~/.zshrc
Solution 8 - Go
Go 1.17+
From 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
Install
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
Environment
- Apple M1 Pro
- Go version go1.17.8 darwin/arm64
Solution 9 - Go
I tried multiple solutions, but at the end I found out that Go environment variables are the actual culprits for this.
If you are on Linux, add these variables in your .bashrc or .bash_profile file.
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT:$GOPATH:$GOBIN
And don't forget to source it after editing (e.g., $source ~/.bashrc
).
Solution 10 - Go
When you run go get -u github.com/golang/protobuf/protoc-gen-go
in Visual Studio Code terminal, and if Visual Studio Code doesn't find $GOPATH and $GOBIN, it will install the package at the default user's home directory /home/$username/go{/bin}
The solution is to move all files in the bin and pkg folders to your current go
path (/usr/local/go{/bin}). The go
path is the one which contains the go
file in the bin folder.
And add this line to the end of the .bashrc file:
export GOPATH=/usr/local/go:$PATH
export GOBIN=/usr/local/go/bin:$PATH
Then reboot the computer.
Solution 11 - Go
Step 1:
sudo apt install protobuf-compiler
Step 2:
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
Step 3:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
Update your PATH so that the protoc compiler can find the plugins:
export PATH="$PATH:$(go env GOPATH)/bin"
Solution 12 - Go
Many of the other responses address path issues, but if it's not installed, you can install it using the following command:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
Solution 13 - Go
In case someone is facing the same issue nowadays.
Install the Go library using
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
Make sure the GOPATH variable is set. In my case I created a folder called gocode, but if your code is located in another folder you have to change it.
export GOPATH=$HOME/gocode
export Path=$Path:$GOPATH/bin
After following these steps, I found another error protoc-gen-go failed :: The import path must contain at least one forward slash ('/') character. To solve this, change the path in the option
syntax = "proto3";
package greet;
option go_package="./greet/greetpb";
service GreetService{}
Solution 14 - Go
NB: Switch to root privileges on your terminal and follow these steps. This got me out of the ditch
- git clone https://github.com/micro/protoc-gen-micro.git /usr/local/go/bin/src/github.com/micro/protoc-gen-micro
- cd src/github.com/micro/protoc-gen-micro
- go build
- cp protoc-gen-micro /bin
Happy coding!