protoc 工具插件和生态


protobuf-go

https://github.com/protocolbuffers/protobuf-go
https://github.com/golang/protobuf
https://github.com/grpc/grpc-go
go get github.com/golang/protobuf/protoc-gen-go

protoc --plugin=protoc-gen-go=$GOPATH/bin/protoc-gen-go --plugin=protoc-gen-micro=$GOPATH/bin/protoc-gen-micro --proto_path=$GOPATH/src:. --micro_out=. --go_out=. greeter.proto

protoc \
  --go_out=Mgrpc/service_config/service_config.proto=/internal/proto/grpc_service_config:. \
  --go-grpc_out=Mgrpc/service_config/service_config.proto=/internal/proto/grpc_service_config:. \
  --go_opt=paths=source_relative \
  --go-grpc_opt=paths=source_relative \
  helloworld/helloworld.proto
  
  protoc -I routeguide/routeguide/route_guide.proto --go_out=plugins=grpc:routeguide --go_out=plugins=grpc:. \

lb

https://github.com/liyue201/grpc-lb
https://github.com/go-kit/kit

protobuf的插件:它们是如何工作

当您调用以下命令时:

protoc -I. --go_out = gen / go foo.proto

以下是(大致)发生的情况:

  1. protoc编译文件foo.proto(以及所有导入),并在内部生成 FileDescriptorSet,它只是FileDescriptorProto消息的列表。这些消息包含有关.proto文件的所有信息,包括可选的源代码信息,例如.proto文件中每个元素的开始/结束行/列以及相关的注释。
  2. FileDescriptorSet被转换为CodeGeneratorRequest,其中包含protoc为foo.proto所有导入生成的FileDescriptorProtos,指定文件的列表(仅foo.proto在此示例中)以及在或=标记后提供的任何选项。--go_out--go_opt
  3. protoc然后查找名为的二进制文件protoc-gen-go并调用它,将序列化的CodeGeneratorRequest 命名为stdin。
  4. protoc-gen-go运行,并且出错或产生 CodeGeneratorResponse,它指定要生成的文件及其内容。序列化的CodeGeneratorRequest写入的stdout protoc-gen-go。
  5. 成功执行时protoc-gen-go,protoc读取stdout,然后写入这些生成的文件。
  6. 内置的protoc,即--java_out,--cpp_out等,在大致相同的方式工作,尽管而不是执行外部二进制,这是内部完成到protoc。
  7. FileDescriptorSets是整个Protobuf生态系统使用的原语,表示已编译的Protobuf模式。它们也是协议产生的主要工件。
  8. 就是说,您所做的一切protoc以及您使用的任何插件都使用FileDescriptorSets进行交谈。值得注意的是,它们也是gRPC Reflection在后台运行的方式。

https://github.com/nilslice/protolock

协议缓冲区配套工具。
跟踪您的.proto文件,并防止更改影响API兼容性的消息和服务。

https://github.com/uber/prototool

您的瑞士军刀用于协议缓冲区

如何使用协议创建FileDescriptorSets

protoc提供--descriptor_set_out别名为的标志,-o以允许编写序列化的FileDescriptorSets。例如,给定一个文件foo.proto,您可以将FileDescriptorSet写入stdout,如下所示:

protoc -I. -o / dev / stdout foo.proto

生成的FileDescriptorSet将包含一个名为name的FileDescriptorProto foo.proto。
默认情况下,FileDescriptorSets将不包含命令行上未指定的任何导入,并且不包含源代码信息。源代码信息对于在生成的存根内部生成文档,以及诸如 linters and breaking变更检测器之类的东西很有用。例如,假设foo.protoimport bar.proto。要产生同时包含foo.proto和的FileDescriptorSet bar.proto以及源代码信息,请执行以下操作:

protoc -I . --include_imports --include_source_info -o /dev/stdout foo.proto

protoc-gen-micro

https://github.com/Leon2012/protoc-gen-micro-lite
https://github.com/Allenxuxu/protoc-gen-mMicro

-I参数:指定import路径,可以指定多个-I参数,编译时按照顺序查找,不指定时默认查找当前目
--go_out:Golang编译支持,支持以下参数
    - `plugins=plugin1+plugin2`:指定插件,支持grpc/micro,即:plugins=grpc+micro
    - `M`参数:指定导入的.proto文件路径编译后对应的goalng包名(不指定默认.proto文件中import语句路径)
    - `import_prefix=xxx`:为所有import路径添加前缀,主要用于编译子目录内的多个proto文件
    - `import_path=foo/bar`:指定未声明package或go_package的文件的包名,最右边的斜线前的字符会被忽略
GOPATH:=$(shell go env GOPATH)

PB_PATH=./pb
GEN_PATH=github.com/micro-in-cn/starter-kit/console/${gen}

proto:
	rm -rf ${gen}/*

protoc --proto_path=${GOPATH}/src:${PB_PATH} \
	--micro_out=Msrv/account.proto=${GEN_PATH}/srv,Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/v2/api/proto:${gen} \
	--go_out=Msrv/account.proto=${GEN_PATH}/srv,Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/v2/api/proto:${gen} \
	--validate_out="lang=go:${gen}" \
	api/account.proto

	protoc --proto_path=${GOPATH}/src:${PB_PATH} \
	--micro_out=${gen} \
	--go_out=:${gen} \
	--validate_out="lang=go:${gen}" \
	srv/account.proto

protoc-gen-go

github.com/golang/protobuf/protoc-gen-go

protoc-gen-validate

https://github.com/envoyproxy/protoc-gen-validate

protoc \
  -I . \
  -I ${GOPATH}/src \
  -I ${GOPATH}/src/github.com/envoyproxy/protoc-gen-validate \
  --go_out=":../generated" \
  --validate_out="lang=go:../generated" \
  example.proto

protoc-gen-gogofast

更快的序列化和反序列化方法
更规范的Go数据结构
兼容 go protobuf
非常多的辅助方法
可以产生测试代码和benchmark代码
其它序列化格式

github.com/gogo/protobuf/protoc-gen-gogofast
protoc-gen-gogo:和protoc-gen-go生成的文件差不多,性能也几乎一样(稍微快一点点)
protoc-gen-gofast:生成的文件更复杂,性能也更高(快5-7倍)
protoc-gen-gofast (在gofast一基础上, 可以导入gogoprotobuf)
protoc-gen-gogofast (在gofast一基础上, 可以导入gogoprotobuf)
protoc-gen-gogofaster (在gogofast基础上, 去掉XXX_unrecognized方法, 更少的指针字段)
protoc-gen-gogoslick (在gogofaster基础上, 辅助方法string, gostring 和 equal)

//gogo
protoc --gogo_out=. *.proto

//gofast
protoc --gofast_out=. *.proto

protoc --gofast_out=plugins=rpcx:. helloworld.proto
protoc --gogofast_out=plugins=rpcx:. helloworld.proto
protoc --gogofaster_out=plugins=rpcx:. helloworld.proto
protoc --gogoslick_out=plugins=rpcx:. helloworld.proto

protoc-gen-doc

https://github.com/pseudomuto/protoc-gen-doc
go get -u github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc
--doc_out=html,index.html:$p/doc
--doc_opt= |<TEMPLATE_FILENAME>,<OUT_FILENAME>

protoc \
  --plugin=protoc-gen-doc=./protoc-gen-doc \
  --doc_out=./doc \
  --doc_opt=html,index.html \
  proto/*.proto
  
  protoc --doc_out=./doc --doc_opt=/path/to/template.tmpl,index.txt proto/*.proto
https://github.com/pseudomuto/protoc-gen-doc/blob/master/examples/proto/Booking.proto

<!---->
/**
 * This is a leading comment for a message
*/
message SomeMessage {
  // this is another leading comment
  string value = 1;
}

<!---->
enum MyEnum {
  DEFAULT = 0; // the default value
  OTHER   = 1; // the other value
}

<!---->
/**
 * @exclude
 * This comment won't be rendered
 */
message ExcludedMessage {
  string id   = 1; // the id of this message.
  string name = 2; // @exclude the name of this message

  /* @exclude the value of this message. */
  int32 value = 3;
}

go-proto-validators

protoc-gen-star

https://github.com/lyft/protoc-gen-star
protoc插件库,用于高效地生成基于proto的代码

protoc-gen-grpc-gateway

github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

protoc -I/usr/local/include -I. \
    -I$GOPATH/src \
    -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
    --grpc-gateway_out=logtostderr=true:. *.proto 
    
protoc -I. \
  --grpc-gateway_out=logtostderr=true,paths=source_relative:./gen/go \
  your/service/v1/your_service.proto

protoc -I$GOPATH/src/ -I./ \
    --swagger_out=logtostderr=true,grpc_api_configuration=api/api.yaml,allow_merge=true,merge_file_name=api/api:. \
    api/*.proto

protoc-gen-swagger

github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

protoc -I/usr/local/include -I. \
  -I$GOPATH/src \
  -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
  --swagger_out=logtostderr=true:. *.proto
  
  --swagger_out=logtostderr=true,repeated_path_param_separator=ssv:.

prototool buf

https://github.com/bufbuild/buf
一种使用协议缓冲区的新方法
https://buf.build
Buf的目标是让Protobuf不仅在技术优点上成为一个不错的选择,而且易于使用,以至于决定不重要。您的组织不必为了有效地使用Protobuf而重新发明轮子。不必担心您的Protobuf管理策略失控。我们会为您处理,因此您可以担心重要的事情。

安装
https://github.com/bufbuild/buf/releases

brew tap bufbuild/buf
brew install buf

protoc-gen-buf-check-breaking
protoc-gen-buf-check-lint

protoreflect

Go Protocol Buffers的反射
https://github.com/jhump/protoreflect


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM