protoc-gen-go-grpc: program not found or is not executable
Asked Answered
F

14

49

go version: go version go1.14 linux/amd64

go.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
)

I am running the following command:

protoc -I ./src/pbdefs/protos/ --go-grpc_out=. src/pbdefs/protos/*.proto

to generate my GRPC output files from .proto files, with I am getting an error

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.
Faircloth answered 7/3, 2020 at 15:3 Comment(0)
B
77

the missing plugin has been implemented at https://github.com/grpc/grpc-go.

command below should fix it

go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
Bolshevism answered 2/6, 2020 at 13:12 Comment(7)
it is still unreleased though, subject to change and missing some features.Faircloth
@AyushGupta do you a workaround? I had to add this for now, so far it seems ok. may just need to keep on track of any changesBolshevism
I'd probably stick with the older version till a stable GA releaseFaircloth
Older version of what?Barthelemy
@Barthelemy just stick with protoc-gen-go instead of upgrading to protoc-gen-go-grpcFaircloth
this has worked for me. here is my requirement require ( github.com/golang/protobuf v1.4.2 // indirect github.com/grpc-ecosystem/grpc-gateway v1.14.6 // indirect google.golang.org/grpc v1.30.0 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200630190442-3de8449f8555 // indirect google.golang.org/protobuf v1.25.0 // indirect )Normally
The proposed solution worked for me.Fortunio
R
32

The Golang Protobuf has released a new version of Go protocol buffers which they are calling it as the APIv2.

Because APIv2 is not backwards compatible with APIv1, therefore we will need to adapt all our Golang code for the new API.

You can learn more about the new API here and here

Migration steps:

In order to run the new code generation will be necessary to install the following gRPC gen plugins:

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

Then use the following command to generate the code.

  # 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"
Reverent answered 13/7, 2020 at 8:49 Comment(3)
go get already installs the binaries at go/bin. So why go install after get'ing?Inadvisable
@BerkantIpek Because "go install [...] is now the recommend way to build and install packages in module mode" and "use of go get to build and install packages is deprecated" since Go 1.16.Tori
The go get seems to be unnecessary if an @version suffix is added to the URL eg. go install google.golang.org/protobuf/cmd/[email protected] This version can be explicit @v1.28.0, loosely specified @v1 or @latestBlubber
M
17

If you haven't done, so you need to install the protoc-gen-go plugin like so:

go get github.com/golang/protobuf/protoc-gen-go

this will install the plugin (if your GOPATH is ${HOME}/go) to:

${HOME}/go/bin/protoc-gen-go

Then when running protoc, either update your path, or set it dynamically like so:

PATH="${PATH}:${HOME}/go/bin" protoc ...
Mizuki answered 7/3, 2020 at 15:26 Comment(7)
I'm tallking about protoc-gen-go-grpc not protoc-gen-goFaircloth
I see, but I've compiled protobuf & grpc with this exact setup. I suspect there's something up with your plugin and/or compiler install. Did you install a precompiled protoc compiler or built it yourself?Mizuki
I built it myself and it was working fine. I'm trying to upgrade according to this and I start getting the errorFaircloth
You may be hitting breaking changes with APIv1 vs APIv2. I have not switched to APIv2 yet. Perhaps using the newer (not github) import path google.golang.org/protobuf?Mizuki
Yes, using go get -u google.golang.org/protobuf/cmd/protoc-gen-go causes the generator to switch to v2, go get -u github.com/golang/protobuf/protoc-gen-go is v1Faircloth
Found the cause, check my answerFaircloth
This was a lifesaver. This answer gave me an idea where the 2 go installs placed the bin folder that I have been looking for more maybe an hour now. Also the compiler is a pain in the ass to install right now. Just use chocolatey that that partAile
F
15

OK, just found out, as per https://github.com/protocolbuffers/protobuf-go/releases/tag/v1.20.0

The v1.20 protoc-gen-go does not support generating gRPC service definitions. In the future, gRPC service generation will be supported by a new protoc-gen-go-grpc plugin provided by the Go gRPC project.

The github.com/golang/protobuf version of protoc-gen-go continues to support gRPC and will continue to do so for the foreseeable future.

EDIT 29/05/2020:

Following an update from @Mark in the comments, according to the Tracking issue on github, protoc-gen-go-grpc has now been merged. However, according to the same issue:

Even with this merged, it is unreleased (v0.0) and subject to change. We do plan to add a requirement that the Unimplemented service implementation be included in all registered services, with an escape hatch in the form of a command-line arg as suggested by @neild.

Faircloth answered 7/3, 2020 at 17:11 Comment(4)
What does that mean. It doesn't answer the question. How and from where would one install protoc-gen-go-grpc. Please answer the question and only then mark it as answer.Frager
@IshanKhare protoc-gen-go-grpc is not released yet.Faircloth
protoc-gen-go-grpc has now been merged.Venge
@Venge thanks for the update. I have added the same to the answer.Faircloth
P
7

Update your PATH so that the protoc compiler can find the plugins: export PATH="$PATH:$(go env GOPATH)/bin"

Practical answered 19/12, 2021 at 10:27 Comment(0)
J
3

Share my useful bash command here:

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
Jasonjasper answered 12/6, 2021 at 2:43 Comment(0)
O
3

Please check the Go Environment variables by running the Go env command on the Terminal and make sure that the following values are set.

GOBIN=some folder location

GOPATH= some folder location

If these are looking good try installing the go plugin

go get -u google.golang.org/grpc

or run the following on the terminal

go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
Oecology answered 16/8, 2022 at 11:25 Comment(0)
V
2

For all who aren't much into the topic (like me) and still have trouble to figure out a working solution, here's a step-by-step approach:

  1. apt install protobuf-compiler installs the compiler under apt install protobuf-compiler, available via protoc from then.
  2. Install the old go generator plugin to be used by protoc: go get -u google.golang.org/protobuf/cmd/protoc-gen-go and go install google.golang.org/protobuf/cmd/protoc-gen-go. Also, make sure that the installed plugin can be found in $PATH or add it with export PATH=$PATH:$(go env GOPATH)/bin if needed.
  3. To tell that plugin not only to generate the protobuf message type information but also the grcp methods, use a command like protoc --go_out=plugins=grpc:my/relative/output/path ./my_file.proto.

Looks kinda trivial once you've figured that out, but it's quite hard to figure that out if you aren't into that topic and only have scarce information about how the go files generator generator and the grcp extension are supposed to work together.

Vitamin answered 15/9, 2020 at 15:27 Comment(2)
Why go install after go get?Inadvisable
@Berkant Ipek Your're right, it should probably be go get -uVitamin
J
1

I was searching for a good answer and finally, it worked for me:

protoc --go-grpc_out=. file_path/file_name*.proto 
Juvenescent answered 27/4, 2021 at 10:19 Comment(1)
this command solved my problem.Tiercel
T
1

I was able to solve a problem in 2022 by finding an answer in a GitHub issue

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

As @neild suggested, I added both GOPATH and GOROOT to my PATH environment variable by using the command

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

'export PATH=$PATH:/usr/local/go/bin' for GOROOT

and it works for me

Toxic answered 17/2, 2023 at 8:20 Comment(0)
I
0

i solve using this command :

  • protoc calculator/calculatorpb/calculator.proto --go-grpc_out=.
  • protoc -I=. --go_out=. calculator/calculatorpb/calculator.proto

to generate calculator_pb.go and 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) {}
}
Infective answered 26/5, 2021 at 9:50 Comment(0)
L
0

I had to install all these:

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
Lindon answered 27/5, 2021 at 14:27 Comment(0)
E
0

Use go get to download the following packages:

$ 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

This installs the protoc generator plugins we need to generate the stubs. Make sure to add $GOPATH/bin to your $PATH so that executables installed via go get are available on your $PATH.

Here's an example of what a protoc command might look like to generate Go stubs, assuming that you're at the root of your repository and you have your proto files in a directory called 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

We use the go and go-grpc plugins to generate Go types and gRPC service definitions. We're outputting the generated files relative to the proto folder, and we're using the paths=source_relative option, which means that the generated files will appear in the same directory as the source .proto file.

You should check out the tutorial series on gRPC-Gateway, i.e., https://grpc-ecosystem.github.io/grpc-gateway/docs/tutorials/. Also, you can refer to my simple hello world program, which uses gRPC-Gateway, i.e., https://github.com/iamrajiv/helloworld-grpc-gateway.

Emmaemmalee answered 5/6, 2021 at 5:45 Comment(0)
R
0

You can also use https://github.com/storyicon/powerproto to install all protoc-related dependencies (including protoc-gen-go-grpc) with one click and for version control.

Redundant answered 22/7, 2021 at 6:21 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.