protobuf编译插件调用规则
要让protoc使用插件,需要做下面事情:
Place the plugin binary somewhere in the PATH and give it the name "protoc-gen-NAME" (replacing "NAME" with the name of your plugin).
If you then invoke protoc with the parameter –NAME_out=OUT_DIR (again, replace "NAME" with your plugin's name), protoc will invoke your plugin to generate the output, which will be placed in OUT_DIR.
Place the plugin binary anywhere, with any name, and pass the –plugin parameter to protoc to direct it to your plugin like so:
1 | protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR |
On Windows, make sure to include the .exe suffix:
1 | protoc --plugin=protoc-gen-NAME=path/to/mybinary.exe --NAME_out=OUT_DIR |
参考: https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.compiler.plugin
产生go的 grpc 代码的插件命令为:
1 | protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto |
这里通过 --NAME_out ,就能知道是需要找 protoc-gen-NAME 插件, 即 protoc-gen-go 插件。
而 --go_out=plugins=grpc 则会在 https://github.com/golang/protobuf 这里找到
https://github.com/golang/protobuf/blob/master/protoc-gen-go/grpc/grpc.go
protoc使用
我们按照惯例执行protoc --help(查看帮助文档),我们抽出几个常用的命令进行讲解
-IPATH, --proto_path=PATH:指定import搜索的目录,可指定多个,如果不指定则默认当前工作目录
--go_out:生成golang源文件
参数
若要将额外的参数传递给插件,可使用从输出目录中分离出来的逗号分隔的参数列表:
1 | protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto |
- import_prefix=xxx:将指定前缀添加到所有import路径的开头
- import_path=foo/bar:如果文件没有声明go_package,则用作包。如果它包含斜杠,那么最右边的斜杠将被忽略。
- plugins=plugin1+plugin2:指定要加载的子插件列表(我们所下载的repo中唯一的插件是grpc)
- Mfoo/bar.proto=quux/shme: M参数,指定.proto文件编译后的包名(foo/bar.proto编译后为包名为quux/shme)
Grpc支持
如果proto文件指定了RPC服务,protoc-gen-go可以生成与grpc相兼容的代码,我们仅需要将plugins=grpc参数传递给--go_out,就可以达到这个目的
1 | protoc --go_out=plugins=grpc:. *.proto |