前言
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
外掛版本不同怎麼辦?
我能想到兩個方案解決:
- 透過兩個環境去完成,例如,打兩個
docker
環境,新專案在一個環境中生成,舊專案在另一個環境中生成。 - 透過區分外掛名稱去完成,例如,將新版本命名為
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
程式碼。
為什麼會存在這兩種生成方式?它們有什麼不同?這是我查詢到的資料:
原文:Differences between protoc-gen-go and protoc-gen-go-grpc
四、protoc
和 protoc-gen-xxx
外掛 和 grpc
和 protobuf
在選擇哪個版本組合使用時,有沒有推薦組合的版本號?
例如,組合的版本號為:
protoc
v3.18.1protoc-gen-go
v1.27.1protoc-gen-go-grpc
v1.1.0grpc
v1.41.0protobuf
v1.27.1
關於上述的版本號,有沒有官方文件推薦使用的版本組合?有朋友們知道嗎?歡迎留言評論 ~
外掛
- 引數驗證:protoc-gen-validate
- 引數驗證:go-proto-validators
- 文件生成:protoc-gen-doc
- grpc-gateway
- protoc-gen-grpc-gateway
- protoc-gen-openapiv2
你還用過哪些有用的外掛?歡迎自薦和推薦,留言區一起討論 ~
小結
以上是我的疑惑及相應疑惑的解決方案,希望對你能夠有所幫助。
推薦閱讀
- Go - 關於 .proto 檔案的小思考
- Go - 使用 sync.WaitGroup 來實現併發操作
- Go - 使用 sync.Map 解決 map 併發安全問題
- Go - 基於逃逸分析來提升程式效能
- Go - 使用 sync.Pool 來減少 GC 壓力
本作品採用《CC 協議》,轉載必須註明作者和本文連結