zoukankan      html  css  js  c++  java
  • 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 代码。

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

    [protoc]

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

    四、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

    关于上述的版本号,有没有官方文档推荐使用的版本组合?有朋友们知道吗?欢迎留言评论 ~

    插件

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

    小结

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

    推荐阅读

    作者:新亮笔记(关注公众号,可申请添加微信好友)
    出处:https://www.cnblogs.com/xinliangcoder
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Codeforces Round #456 (Div. 2)
    Codeforces Round #455 (Div. 2)
    Codeforces Round #453 (Div. 1)
    Codeforces Round #450 (Div. 2)
    退役了
    退役了
    这个博客不想要了
    Hello!The familiar and strange world.
    真正的退役了。
    bzoj4231: 回忆树
  • 原文地址:https://www.cnblogs.com/xinliangcoder/p/15647996.html
Copyright © 2011-2022 走看看