要让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(查看帮助文档),我们抽出几个常用的命令进行讲解

  1. -IPATH, --proto_path=PATH:指定import搜索的目录,可指定多个,如果不指定则默认当前工作目录

  2. --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