AI智能
改变未来

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

插件版本不同怎么办?

我能想到两个方案解决:

  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

代码。

为什么会存在这两种生成方式?它们有什么不同?这是我查询到的资料:

[protoc]

原文:Differences between protoc-gen-go and protoc-gen-go-grpc

四、

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
  • 参数验证:go-proto-validators
  • 文档生成:protoc-gen-doc
  • grpc-gatewayprotoc-gen-grpc-gateway
  • protoc-gen-openapiv2

你还用过哪些有用的插件?欢迎自荐和推荐,留言区一起讨论 ~

小结

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

推荐阅读

  • Go – 关于 .proto 文件的小思考
  • Go – 使用 sync.WaitGroup 来实现并发操作
  • Go – 使用 sync.Map 解决 map 并发安全问题
  • Go – 基于逃逸分析来提升程序性能
  • Go – 使用 sync.Pool 来减少 GC 压力
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Go – 关于 protoc 工具的小疑惑