Созданный файл Protobuf не распознает путь импорта
У меня есть прото-файл, и я хочу использовать его в формате. Я могу успешно импортировать
product.proto
в
catalog.proto
но автоматически сгенерированный
catalog.pb.go
не может изменить путь своей зависимости, т.е.
product.pb.go
. Говорится:
не удалось импортировать каталог / pb / entity (не удалось найти пакет «catalog / pb / entity» ни в одном из / usr / local / go / src / catalog / pb / entity (из $GOROOT)
/ Users / trimulabs / go / src / каталог / pb / entity (от $GOPATH))
Структура каталогов
📦catalog
┣ 📂main
┃ ┣ 📜client.go
┃ ┗ 📜server.go
┣ 📂pb
┃ ┣ 📂entities
┃ ┃ ┣ 📜product.pb.go
┃ ┃ ┗ 📜product.proto
┃ ┣ 📜catalog.pb.go
┃ ┗ 📜catalog.proto
catalog.proto
syntax = "proto3";
package catalog;
import "catalog/pb/entities/product.proto";
service CatalogService {
rpc PostProduct (PostProductRequest) returns (PostProductResponse) {}
rpc GetProduct (GetProductRequest) returns (GetProductResponse) {}
rpc GetProducts (GetProductsRequest) returns (GetProductsResponse) {}
}
product.proto
message Product {
string id = 1;
string name = 2;
string description = 3;
double price = 4;
}
message PostProductRequest {
string name = 1;
string description = 2;
double price = 3;
}
message PostProductResponse {
Product product = 1;
}
message GetProductRequest {
string id = 1;
}
message GetProductResponse {
Product product = 1;
}
message GetProductsRequest {
uint64 skip = 1;
uint64 take = 2;
repeated string ids = 3;
string query = 4;
}
message GetProductsResponse {
repeated Product products = 1;
}
Кто-нибудь может помочь?
1 ответ
Ошибка, которую вы видите, вызвана тем, что ваш сгенерированный файл protobuf, вероятно, имеет неправильный путь импорта.
Если вы проверите свой
product.pb.go
файл, скорее всего, он имеет что-то вроде:
import "catalog/pb/entities"
Это означает, что он пытается импортировать пакет go по указанному пути. Как вы, вероятно, знаете, пакет go должен использовать абсолютный путь, поэтому он должен выглядеть примерно так:
import "github.com/<myuser>/<myproject>/catalog/pb/entities"
К счастью, поддерживает несколько флагов, которые помогут вам в этом.
Шаг 1. Установите
go_package
в твоей
.proto
файл, чтобы указать ожидаемый путь импорта в go.
option go_package = "example.com/foo/bar";
Шаг 2: используйте
--go_opt=module=github.com/<myuser>/<project>
флаг
protoc
чтобы удалить префикс модуля из вашего сгенерированного кода. В противном случае вы бы получили что-то вроде этого в качестве вывода (при условии, что вы используете текущий каталог в качестве
go_out
дорожка
catalog/
main/
pb/
github.com/
<myuser>/
<project>/
catalog/
pb/
entities/
Я бы рекомендовал просмотреть страницу документации на
protoc-gen-go
идут флаги: