前言
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
代碼。
為什么會存在這兩種生成方式?它們有什么不同?這是我查詢到的資料:
[protoc]
原文: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
你還用過哪些有用的插件?歡迎自薦和推薦,留言區一起討論 ~
小結
以上是我的疑惑及相應疑惑的解決方案,希望對你能夠有所幫助。