使用谷歌标准api时protobuf生成遇到的问题

2020-03-15  本文已影响0人  天地一小儒

在vscode时新增proto文件时,按下sr会出现一个快捷生成CRUD服务的例子


srvcrud

然后再protoc生成时发现报如下错误:

map/proto/service.proto:85:3: "FieldMask" is not defined.
map/proto/service.proto:35:44: "google.protobuf.Empty" is not defined.

网上找了一大堆源码,刚开始是直接引入两个的proto文件,地址是:
https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/field_mask.proto
https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/empty.proto

但下载这个库然后再protoc里加入proto_path后又发现报google.api.http找不到的错。
结果偶然在https://github.com/grpc-ecosystem/grpc-gatewayREADME.md上发现需要引入annotations.proto

annotations.proto

引入后又报一个undefined: runtime.CamelCaseFieldMask的错误,查看grpc-gateway网关的源码,发现在1.11.3版本后此方法被删除,怀疑是我本地版本过低的原因,但go install、go get好几次这个gateway的库也是这个错,无奈之下,只能手动在go mod里面降级,不得不说,这里go mod的强大性就体现出来了,改个数字就能降级升级。

go.mod

再重新生成,果然没有任何错误了。完成编译代码如下:

protoc -I$(GOPATH)/src:. -I/usr/local/include -I. \
        -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@v1.11.2/third_party/googleapis \
        --go_out=plugins=grpc:.  --grpc-gateway_out=logtostderr=true:. \
        --swagger_out=logtostderr=true:. map/proto/service.proto
上一篇下一篇

猜你喜欢

热点阅读