protocol buffers 是一种数据交互规范(感觉类似 json,xml 这种),protobuf跨平台、跨语言(即各种编程语言都有对应的处理包,只要遵从相同的规范,就可以实现编码解码)
protoc 用法及参数
- 使用方法:
protoc [OPTION] PROTO_FILES
- 参数:
-IPATH, --proto_path=PATH
: 寻找依赖包的导入路径,可以多次指定,指定 proto_path 时,需要编译的 PROTO_FILES文件必须要在某个 proto_path 中
常见问题
-
proto文件中导入包不存在
syntax = "proto3"; package videoup.open.service.v1; option go_package = "api"; import "google/api/annotations.proto"; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "google/protobuf/empty.proto"; service VideoUpOpen { }
google/api/annotations.proto: File not found. github.com/gogo/protobuf/gogoproto/gogo.proto: File not found. api.proto:5:1: Import "google/api/annotations.proto" was not found or had errors. api.proto:6:1: Import "github.com/gogo/protobuf/gogoproto/gogo.proto" was not found or had errors.
报错是因为 protoc 无法找到.proto文件中导入的包。需要明确两个点,一是导入的包必须是已经下载下来的,二是需要指定 protoc 查找导入包的路径。通过
protoc --proto_path='xxx'
可以指定查找路径 -
遇到了一个编译 xxx.proto 文件时,因 protobuf 版本问题导致编译后的 import 路径变化较大
原因是:
安装protobuf时会自动使用最新版本,新旧版本的protoc对于 .google.protobuf.Empty 的引用不同 新版本3.1.4:emptypb "google.golang.org/protobuf/types/known/emptypb" 旧版本3.1.3:empty "github.com/golang/protobuf/ptypes/empty"
根据实际情况看是否需要解决,如果不影响系统,可以忽略,一定要解决可以降级 protobuf 版本
// 卸载 3.1.4的 protobuf brew uninstall protobuf // 安装3.1.3 版本 PROTOC_ZIP=protoc-3.13.0-osx-x86_64.zip curl -OL https://github.com/protocolbuffers/protobuf/releases/download/ v3.13.0/$PROTOC_ZIP sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*' rm -f $PROTOC_ZIP