[英]Service compiling successfully, but message structs not generating - gRPC/Go
我使用 gRPC/protobufs 作為我的客戶端和服務器之間通信的協議,它們都寫在 go 中。我能夠運行下面的命令來生成cards.pb.go
(服務器)和cards_grpc.pb.go
(客戶端)文件沒有任何問題。 服務器文件運行良好,沒有任何問題。 但是,客戶端文件似乎無法訪問我在cards.proto
文件中定義的message
項。 我的服務以及我的客戶端代碼需要定義的消息結構才能調用服務方法,但我不確定我缺少什么。
這是我正在運行的命令:
protoc -I="./protos" \
--go_out=plugins=grpc:./server \
--go-grpc_out=./client \
protos/*.proto
這是我的項目文件結構:
|-- client
|-- protos (generated protobufs for client)
|-- cards_grpc.pb.go (this compiled successfully, but structs representing my messages cannot be found)
|-- protos (This is where the proto files are defined)
|-- cards.proto
|-- server
|-- protos (generated protobufs for server)
|-- cards.pb.go (this is working perfectly, has compiled services and messages)
注意:我已經定義option go_package = "./protos";
在我的cards.proto
文件中,這就是生成的文件輸出到*/protos/*.pb.go
位置的原因
因此,您不會在此處為客戶端代碼生成任何與 protobuf 相關的代碼,而只會生成 gRPC 代碼。 為了生成您要查找的結構,請使用以下命令:
protoc -I./protos \
--go_out=./server \
--go-grpc_out=./server \
--go_out=./client \
--go-grpc_out=./client \
protos/*.proto
--go_out
為 protobuf 生成 go 代碼, --go-grpc_out
生成 go 代碼。
另一件事,go不再支持--go_out=plugins=grpc
。 您應該使用--go-grpc_out
。
我強烈建議與客戶端和服務器共享 proto 目錄(如果可能),這限制了由於未同步的 Proto 文件導致的潛在錯誤。
所以你會有類似的東西:
|-- client
|-- protos
|-- cards.proto
|-- cards_grpc.pb.go
|-- cards.pb.go
|-- server
然后兩者都訪問所需的文件。
其次,如果你正在使用 Go 模塊,我建議你使用go_package
如下:
option go_package = "${YOUR_MODULE}/protos"
然后生成如下代碼:
protoc -Iprotos \
--go_opt=module=${YOUR_MODULE} --go_out=. \
--go-grpc_opt=module=${YOUR_MODULE} --go-grpc_out=. \
protos/*.proto
注意.
對於--go_out
和--go-grpc_out
。 這會將項目的根映射到模塊名稱,這將通過將模塊名稱刪除到go_package
選項來在protos
目錄中生成代碼。 然后您將能夠像這樣在您的代碼中訪問此生成的代碼:
import (
pb "${YOUR_MODULE}/protos"
)
只是為了清楚go_package
,您需要了解一件事:protobuf package 和go_package
不是一回事,前者定義 package 僅可用於 in.proto 文件,后者定義package...
在您的 go 文件中. 一個例子:
//...
package protos;
message Test {}
//...
//...
//no package definition
message Test2 {
protos.Test a_test = 1;
}
//...
go_package
module my_module
//...
option go_package = "my_module/protos"
message Test {}
//...
protoc -I./protos \
--go_out=./server \
--go-grpc_out=./server \
--go_out=./client \
--go-grpc_out=./client \
protos/file1.proto
package main
import (
pb "my_module/proto"
)
func main() {
var test pb.Test;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.