2021-07-15

Protobuf,protoc,proto-gen-grpc版本兼容问题+解决方法

编译命令

  • 参考文档
    • https://studygolang.com/articles/28132?fr=sidebar
protoc  --go_out=plugins=grpc:./ *.proto

issue1

172-1-1-156:proto $ protoc  --go_out=plugins=grpc:./ *.proto
--go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC

protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    *.proto
  • protoc-gen-go版本问题
  • 解决方法
See https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code for more information.
172-1-1-156:proto $ GO111MODULE=on go get -u github.com/golang/protobuf/protoc-gen-go@v1.3.5
go get: downgraded github.com/golang/protobuf v1.5.0 => v1.3.5
go get: downgraded google.golang.org/protobuf v1.26.0 => v1.26.0-rc.1

issue2

# trading-system/grpc/etc/proto
grpc/etc/proto/etc.pb.go:30:11: undefined: "github.com/golang/protobuf/proto".ProtoPackageIsVersion4

  • 问题分析
    • 不是最新版本
  • 解决方法
//我只用了如下方法
go get -u google.golang.org/grpc
go install github.com/golang/protobuf/protoc-gen-go

// 以下方法来自http://www.manongjc.com/detail/11-wgczdfriohrkgjm.html
GIT_TAG="v1.2.0" # change as needed
go get -d -u github.com/golang/protobuf/protoc-gen-go
git -C "$(go env GOPATH)"/src/github.com/golang/protobuf checkout $GIT_TAG
go install github.com/golang/protobuf/protoc-gen-go

issue 3

*ApiGRPCServer does not implement "trading-system/grpc/api/proto".ApiServiceServer (missing "trading-system/grpc/api/proto".mustEmbedUnimplementedApiServiceServer method)
                have mustEmbedUnimplementedApiServiceServer()
                want "trading-system/grpc/api/proto".mustEmbedUnimplementedApiServiceServer()
  • 解决方法 同issue2
  • 用如下命令

protoc --go_out=plugins=grpc:./ *.proto

问题总结

  • google.golang.org/protobuf/cmd/protoc-gen-go
    • 插件错误,目前google自己包不支持grpc插件功能

    • 参考issue:https://github.com/golang/protobuf/issues/1070

    • 错误提示

plugins are not supported; use 'protoc --go-grpc_out=...' 
  • github.com/golang/protobuf/protoc-gen-go

    • github提供的插件是支持的
  • 版本兼容支持,目前以下版本是兼容的

    • github.com/golang/protobuf v1.5.2
    • google.golang.org/grpc v1.39.0
    • google.golang.org/protobuf v1.27.1
  • 关于go.mod文件,自动升级的问题

In Go 1.15 and lower, the -mod=mod flag was enabled by default, so updates were performed automatically. Since Go 1.16, the go command acts as if -mod=readonly were set instead: if any changes to go.mod are needed, the go command reports an error and suggests a fix
  • go 1.16之后都是默认readonly
  • go 1.16之前的用 (go build, go get, go install, go list, go test, go mod tidy)-mod=readonly
上一篇:grpc_status总结


下一篇:spring 使用说明(转)