Go - 關於 protoc 工具的小疑惑

xinliang發表於2022-01-09

前言

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 程式碼。

為什麼會存在這兩種生成方式?它們有什麼不同?這是我查詢到的資料:

原文: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

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

外掛

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

小結

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

推薦閱讀

本作品採用《CC 協議》,轉載必須註明作者和本文連結
日拱一卒

相關文章