Go|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
插件版本不同怎么办?【Go|Go - 关于 protoc 工具的小疑惑】我能想到两个方案解决:
- 通过两个环境去完成,例如,打两个
docker
环境,新项目在一个环境中生成,旧项目在另一个环境中生成。 - 通过区分插件名称去完成,例如,将新版本命名为
protoc-gen-go-new
,将旧版本命名为protoc-gen-go-old
,生成新版本时使用--go-new_out
,生成旧版本时使用--go-old_out
。
三、
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
代码。为什么会存在这两种生成方式?它们有什么不同?这是我查询到的资料:
[protoc]
原文:Differences between protoc-gen-go and protoc-gen-go-grpc
四、
protoc
和 protoc-gen-xxx
插件 和 grpc
和 protobuf
在选择哪个版本组合使用时,有没有推荐组合的版本号?例如,组合的版本号为:
protoc
v3.18.1protoc-gen-go
v1.27.1protoc-gen-go-grpc
v1.1.0grpc
v1.41.0protobuf
v1.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 压力
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 醒不来的梦
- 孩子不是实现父母欲望的工具——林哈夫
- 关于自我为中心的一点感想
- 最有效的时间管理工具(赢效率手册和总结笔记)
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想