Созданный файл 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 идут флаги:

Другие вопросы по тегам