Go - 关于 protoc 工具的小疑惑 
                                                    
                        
                    
                    
  
                    
                    前言
protoc 工具可以干什么?
protoc 工具可以 通过相关插件 将 .proto 文件编译成 C、C++、Golang、Java、Python、PHP 等多种语言的代码。
本文主要讨论通过 protoc 生成 Golang 代码,例如我们常见的命令:
protoc -I . --go_out=xxx
想了解更多参数,执行 protoc --help 查看。
疑惑
一、如何知道 protoc 使用的什么插件?
例如:--go_out 使用的是什么插件?最终了解到使用的是 protoc-gen-go 插件。
例如:--go-grpc_out 使用的是什么插件?最终了解到使用的是 protoc-gen-go-grpc 插件。
也通过使用其他插件,总结出一个规律:
go_out对应protoc-gen-go插件;go-grpc_out对应protoc-gen-go-grpc插件;- …
 *_out对应protoc-gen-*插件;
二、例如新老项目使用的 protoc-gen-go 插件版本不同怎么办?
我能想到两个方案解决:
- 通过两个环境去完成,例如,打两个 
docker环境,新项目在一个环境中生成,旧项目在另一个环境中生成。 - 通过区分插件名称去完成,例如,将新版本命名为 
protoc-gen-go-new,将旧版本命名为protoc-gen-go-old,生成新版本时使用--go-new_out,生成旧版本时使用--go-old_out。 
很显然,第 2 个方案成本更小。
三、protoc-gen-go 和 protoc-gen-go-grpc 这两个插件有什么不同?
当使用参数 --go_out=plugins=grpc:xxx 生成时,生成的文件 *.pb.go 包含消息序列化代码和 gRPC 代码。
当使用参数 --go_out=xxx --go-grpc_out=xxx 生成时,会生成两个文件 *.pb.go 和 *._grpc.pb.go ,它们分别是消息序列化代码和 gRPC 代码。
为什么会存在这两种生成方式?它们有什么不同?这是我查询到的资料:

原文:Differences between protoc-gen-go and protoc-gen-go-grpc
四、protoc 和 protoc-gen-xxx 插件 和 grpc 和 protobuf 在选择哪个版本组合使用时,有没有推荐组合的版本号?
例如,组合的版本号为:
protocv3.18.1protoc-gen-gov1.27.1protoc-gen-go-grpcv1.1.0grpcv1.41.0protobufv1.27.1
关于上述的版本号,有没有官方文档推荐使用的版本组合?有朋友们知道吗?欢迎留言评论 ~
插件
- 参数验证:protoc-gen-validate
 - 参数验证:go-proto-validators
 - 文档生成:protoc-gen-doc
 - grpc-gateway
- protoc-gen-grpc-gateway
 - protoc-gen-openapiv2
 
 
你还用过哪些有用的插件?欢迎自荐和推荐,留言区一起讨论 ~
小结
以上是我的疑惑及相应疑惑的解决方案,希望对你能够有所帮助。
推荐阅读
- Go - 关于 .proto 文件的小思考
 - Go - 使用 sync.WaitGroup 来实现并发操作
 - Go - 使用 sync.Map 解决 map 并发安全问题
 - Go - 基于逃逸分析来提升程序性能
 - Go - 使用 sync.Pool 来减少 GC 压力
 
本作品采用《CC 协议》,转载必须注明作者和本文链接
          
          
          
                关于 LearnKu