亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang proto 文件管理和導入

Golang proto 文件管理和導入

Go
鳳凰求蠱 2023-08-14 15:13:20
我有 2 個 grpc 服務(service1和service2)相互交互,在某些情況下,rpc 響應service1將由 中定義的結構組成service2,在遇到重復不可避免的幾種情況之后,我認為隨著服務的增長,這些將變得困難為了管理,所以我現在將原始文件重組為這樣的東西.├── app...├── proto│   ├── service1│   │   ├── service1.access.proto │   │   ├── service1.proto│   ├── service2│   │   ├── service2.access.proto│   │   └── service2.proto│   └── model│       ├── model.service1.proto│       └── model.service2.proto└── proto-gen // the protoc generated files     ├── service1    │   ├── service1.access.pb.go    │   └── service1.pb.go    ├── service2    │   ├── service2.access.pb.go    │   └── service2.pb.go    └── model        ├── model.service1.pb.go        └── model.service2.pb.goservice1需要導入模型定義model/model.service2.proto,所以我像這樣導入它import "model/model.service2.proto";option go_package = "proto-gen/service1"; 我.pb.go使用這個protoc命令生成文件ls proto | awk '{print "protoc --proto_path=proto proto/"$1"/*.proto --go_out=plugins=grpc:."}' | sh該命令生成.pb.go文件很好,但代碼service1.access.pb.go似乎沒有正確導入模型,我不知道它是否相關,但當我運行應用程序時,它會拋出此錯誤cannot load model: malformed module path "model": missing dot in first path element我現在花了幾個小時搜索如何正確導入另一個原始文件,我似乎找不到任何解決方案
查看完整描述

3 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

您收到該錯誤的原因model是因為生成的文件使用go_package導入文件的 ,并且model不是有效的導入路徑。您必須說服生成的文件使用包的完整導入路徑。

這就是我為源樹所做的:我有一個類似的相互導入的原始文件樹。如果您的模塊名為 ,github.com/myapp則運行protocwith --proto-path=<directory containing github.com>,使用完整路徑(即 )導入其他 proto 文件github.com/myapp/proto/service1/service1.proto,并在 service1.proto 中定義go_package = service1。在我的例子中,此設置可以正確寫入導入路徑。

在采用此解決方案之前,我正在使用go_package=<full path to proto>,因此您也可以嘗試一下。


查看完整回答
反對 回復 2023-08-14
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

在 Burak Serdar 的基礎上,我想提供我的實現。

在要導入的原型上設置類似于此的包,其中位置是完整路徑。我的路徑一般是github.com/AllenKaplan/[project]/[package]/proto/

option go_package = [path];

在您要導入的文件中添加導入。我的路徑一般是[package]/proto/[package].proto

import = [path from protoc proto path]

最后一部分是 protoc 命令,您必須以連接導入路徑和選項 go_package 路徑的方式定義 protopath

如果從github.com/AllenKaplan/[project]目錄執行,我會調用

protoc -I. --go_out=./[package]/proto [package]/proto/[package].proto

-I. === --proto_path.

設置-I.整個項目的原型路徑


需要注意的是,當調用要導入的protoc文件時.proto,您需要添加source_relative:到輸出中,以確保輸出來自帶有一組包的根目錄。

我在調用時對導入協議的實現github.com/AllenKaplan/[project]/[package]

protoc -I./proto --go_out=paths=source_relative:./proto [package].proto


查看完整回答
反對 回復 2023-08-14
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

我在導入時也遇到了類似的問題。已使用以下內容更改了 .protoc 文件選項包。

option go_package = "./;proto-gen/service1";
  1. 第一個參數表示要生成的代碼的相對路徑。

  2. 您在命令中設置的相對于 --go_out 的路徑。


查看完整回答
反對 回復 2023-08-14
  • 3 回答
  • 0 關注
  • 278 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號