簡體   English   中英

服務編譯成功,但未生成消息結構 - gRPC/Go

[英]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 文件中. 一個例子:

對於 Protobuf package

文件1.proto

//...
package protos;

message Test {}
//...

文件2.proto

//...
//no package definition

message Test2 {
    protos.Test a_test = 1;
}
//...

對於go_package

go.mod

module my_module

file1.proto(位於:${ROOT}/protos)

//...
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 

主要.go

package main

import (
    pb "my_module/proto"
)

func main() {
    var test pb.Test;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM