Go - 关于 protoc 工具的小疑惑

简介: Go - 关于 protoc 工具的小疑惑

文章目录:

  • 前言
  • 疑惑
  • 插件
  • 小结
  • 推荐阅读


前言

protoc 工具可以干什么?

protoc 工具可以 通过相关插件.proto 文件 编译 CC++GolangJavaPythonPHP 等多种语言的代码。

本文主要讨论通过 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 插件版本不同怎么办?

我能想到两个方案解决:

  1. 通过两个环境去完成,例如,打两个 docker 环境,新项目在一个环境中生成,旧项目在另一个环境中生成。
  2. 通过区分插件名称去完成,例如,将新版本命名为 protoc-gen-go-new,将旧版本命名为 protoc-gen-go-old,生成新版本时使用 --go-new_out,生成旧版本时使用 --go-old_out

很显然,第 2 个方案成本更小。


三、protoc-gen-goprotoc-gen-go-grpc 这两个插件有什么不同?

当使用参数 --go_out=plugins=grpc:xxx 生成时,生成的文件 *.pb.go 包含消息序列化代码和 gRPC 代码。

当使用参数 --go_out=xxx --go-grpc_out=xxx 生成时,会生成两个文件 *.pb.go*._grpc.pb.go ,它们分别是消息序列化代码和 gRPC 代码。

为什么会存在这两种生成方式?它们有什么不同?

这是我查询到的资料:

801d4ef558c73e8a978d560ac2c0995a.png

原文地址:Differences between protoc-gen-go and protoc-gen-go-grpc[1]


四、protocprotoc-gen-xxx 插件 和 grpcprotobuf 在选择哪个版本组合使用时,有没有推荐组合的版本号?

例如,组合的版本号为:

  • protoc v3.18.1
  • protoc-gen-go v1.27.1
  • protoc-gen-go-grpc v1.1.0
  • grpc v1.41.0
  • protobuf v1.27.1

关于上述的版本号,有没有官方文档推荐使用的版本组合?

有朋友们知道吗?欢迎留言评论 ~

插件

  • 参数验证:protoc-gen-validate[2]
  • 参数验证:go-proto-validators[3]
  • 文档生成:protoc-gen-doc[4]
  • grpc-gateway[5]
  • protoc-gen-grpc-gateway
  • protoc-gen-openapiv2

你还用过哪些有用的插件?

欢迎自荐和推荐,留言区一起讨论 ~

小结

以上是我的疑惑及相应疑惑的解决方案,希望对你能够有所帮助。

推荐阅读

参考资料

[1]Differences between protoc-gen-go and protoc-gen-go-grpc: https://stackoverflow.com/questions/64828054/differences-between-protoc-gen-go-and-protoc-gen-go-grpc

[2]protoc-gen-validate: https://github.com/envoyproxy/protoc-gen-validate

[3]go-proto-validators: https://github.com/mwitkow/go-proto-validators

[4]protoc-gen-doc: https://github.com/pseudomuto/protoc-gen-doc

[5]grpc-gateway: https://github.com/grpc-ecosystem/grpc-gateway

目录
相关文章
|
测试技术 API 开发者
【Docker项目实战】在Docker环境下部署go-file文件分享工具
【2月更文挑战第15天】在Docker环境下部署go-file文件分享工具
571 1
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
487 0
|
算法 测试技术 Go
Go 1.24.0 重磅发布:新特性、新工具,开发者必看!
`Go 1.24.0` 已正式发布,带来诸多改进和新特性。语言层面上,泛型类型别名现已被完全支持;性能方面,通过优化 `map` 实现和内存分配,减少了 2-3% 的 CPU 开销;工具链新增模块工具依赖跟踪及测试分析器;标准库增加了弱引用包、FIPS 140-3 合规机制等;WebAssembly 支持也得到了增强。快来下载体验吧!
796 15
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
264 2
|
算法 测试技术 Go
|
Shell Go
Go 语言Air 工具使用入门
在Go开发中,频繁的手动重启应用以加载新代码既耗时又低效。为此,我们引入了Air——一款专为Go项目设计的自动重载工具。Air通过监听文件变化,实现代码更改后的自动编译与运行,极大提升了开发效率。本文将指导你完成Air的安装与配置,包括如何启动Air、忽略临时文件以及理解其工作原理,让Go项目开发更加流畅高效。
381 3
|
编译器 Go 索引
浅谈go语言中的符文字符处理工具
【5月更文挑战第20天】本文简述了Go 1.20之后的rune符文处理工具和函数,`unsafe`包新增了SliceData、String和StringData函数,支持直接将slice转换为array,明确了数组和结构体比较顺序。
256 1
浅谈go语言中的符文字符处理工具
|
关系型数据库 MySQL Go
Go - 代码生成工具
Go - 代码生成工具
198 3
|
Kubernetes 数据可视化 Java
|
JSON Go 数据格式
Go - 使用工具生成易读的 Protocol 文档
Go - 使用工具生成易读的 Protocol 文档
144 1

热门文章

最新文章