文章目录:


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

前言

​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​​ 插件版本不同怎么办?

我能想到两个方案解决:


  1. 通过两个环境去完成,例如,打两个 ​​docker​​ 环境,新项目在一个环境中生成,旧项目在另一个环境中生成。
  2. 通过区分插件名称去完成,例如,将新版本命名为 ​​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​​ 代码。

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

这是我查询到的资料:

Go - 关于 protoc 工具的小疑惑_javascript

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

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

例如,组合的版本号为:


  • ​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