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

關於上述的版本號,有沒有官方文檔推薦使用的版本組合?有朋友們知道嗎?歡迎留言評論 ~

插件

你還用過哪些有用的插件?歡迎自薦和推薦,留言區一起討論 ~

小結

以上是我的疑惑及相應疑惑的解決方案,希望對你能夠有所幫助。

推薦閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章