Google Protobuf 编译器使用笔记
背景
Protobuf 是 google 开源的高性能序列化库,支持 C++、C#、Dart、Java、Go、Python、Rust 等语言,同时也是跨平台的。
Protobuf 包含序列化格式的定义、各种语言的库以及一个 IDL 编译器。正常情况下你需要定义 proto 文件,然后使用 IDL 编译器编译成你需要的语言。
关于什么是 IDL 编译器,请继续往下看。
什么是 protoc
protoc 就是上面提到的 IDL 编译器,也叫 Google protocol buffers compiler
,可以把 proto 文件生成成指定语言的序列化代码。
如何安装
Mac 环境可以使用 brew 安装:
|
|
插件安装
proto 需要一个插件来生成 Go 代码,通过以下方式安装:
|
|
安装 grpc 相关插件:
|
|
安装 grpc-gateway 相关插件:
|
|
安装 gogo/protobuf 相关插件:
|
|
基本用法
protoc 常用参数:
|
|
这里假设 proto 文件里面定义的 go_package 为:
|
|
输出的 Go 文件所在的目录的取决于 go_package 选项和编译器(protoc)参数。
默认情况
默认情况生成的代码文件输出位置在 go_package 指定的导入目录。
比如我们有上面 go_package
配置的 protos/foo.proto
,那么通过下面得到的文件为 example.com/foo/bar/foo.pb.go
。
|
|
指定 –go_opt=module=$PREFIX
如果在使用 protoc 时指定 --go_opt=module=$PREFIX
参数,则在生成代码文件时会忽略 $PREFIX
前缀。
比如我们有上面 go_package
配置的 protos/foo.proto
,并指定 --go_opt=module=example.com/foo
参数,那么生成的代码为bar/foo.pb.go
, 可以看出 example.com/foo
前缀被去掉了。
|
|
指定 –go_opt=paths=source_relative
如果在使用 protoc 时指定 --go_opt=paths=source_relative
参数(注意 source_relative 是固定写法),则输出文件和输入的 proto 文件在相对的目录,而忽略掉 go_package。
比如我们有上面 go_package
配置的 protos/foo.proto
,并指定 --go_opt=paths=source_relative
参数,那么生成的代码为protos/foo.pb.go
。
|
|
上面这个例子可能还不够清晰,我们再举个栗子:
|
|
这时生成的 Go 代码路径为 hello/protos/foo.pb.go
,所以这里说的相对目录是指在 --go_out=PATH
前提条件下相对 proto 文件的位置,并不一定和 proto 文件在同一目录下。
最后一个例子
当我们执行如下命令:
|
|
protoc 编译器将读取文件 src/foo.proto
和 src/bar/baz.proto
。它产生两个输出文件:build/gen/foo.pb.go
和 build/gen/bar/baz.pb.go
。
如有必要,编译器会自动创建目录 build/gen/bar
,但不会创建 build
或 build/gen
,它们必须已经存在,否则会报错。
其他插件
当我们需要生成 grpc 代码时:
|
|
也就是新增了 --go-grpc_out
和 --go-grpc_opt
参数,这是 protoc-gen-go-grpc
插件实现的功能。
当我们需要生成 grpc-gateway 代码时:
我们看一个官方的例子:
|
|
如果需要生成 OpenAPI 则需要使用到 protoc-gen-openapiv2
插件,我们看个官方的例子:
|
|
关于 grpc 相关的代码生成,其实分三种情况,官方也给出了详细的说明示例,可以戳链接查看。
当我们需要生成 gogo/protobuf 代码时:
|
|
这里可以看出,只是将原来的 --go_out
参数替换为 --gofast_out
就可以享受 gogo/protobuf 带来的性能提高。
当然,如果还想加速性能的话可以使用其他插件,官方提供了另外的几种插件,可以戳链接查看。
参考链接
https://developers.google.com/protocol-buffers/docs/reference/go-generated
https://grpc.io/docs/languages/go/quickstart/
https://github.com/grpc/grpc-go
- 原文作者:maratrix
- 原文链接:https://maratrix.cn/post/2021/01/15/how-to-use-protoc-notes/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。