прото-импорт из родительского каталога не работает

# #c #go #grpc #proto

Вопрос:

Не могу понять, как делать импорт в прото, очень ценю некоторую помощь.

Структура файла:

  • прото
    • API
      • пункт.прото
    • пункт.прото

Я пытаюсь импортировать proto/item.proto в proto/api/item.proto

proto/api/item.proto :

 syntax = "proto2";
import "item.proto"

service ItemService {

  rpc ListItems(ListItemsRequest) returns (ListItemsResponse);
}

message ListItemsRequest {
  //Empty message
}

message ListItemsResponse {

  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
    json_schema: {
      required:["items"]
    }
  };

  repeated .item.Item wallets = 1;
}
 

Линия для генерации:

 protoc 
    --proto_path=proto/ 
    --proto_path=third_party/grpc-gateway/third_party/googleapis 
    --proto_path=third_party/grpc-gateway 
    --include_source_info 
    --include_imports 
    --descriptor_set_out="$DESCRIPTOR_OUT" 
    --cpp_out="$CPP_OUT" 
    --grpc_out="$CPP_OUT" 
    --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` 
    proto/api/item.proto
 

Выплевывает ошибку:

 api/item.proto:57:12: ".item.Item" is not defined.
 

Ответ №1:

Я предполагаю, что вы не добавили спецификатор пакета в proto/item.proto файл. Посмотри на это и на это. Если вы укажете пакет в импортированном файле, вы не получите никаких ошибок:

 syntax = "proto2";
package item;

message Item {}
 

Вы также можете не добавлять спецификатор пакета в импортированный файл и удалить пакет из имени сообщения (в proto/api/item.proto ):

 message ListItemsResponse {
    repeated .Item wallets = 1;
}
 

В качестве дополнительного примечания документация protobuf рекомендует всегда импортировать файлы относительно корневого каталога проекта. Я предполагаю, что этот метод может помочь сохранить управляемость проектом, я не смог найти никаких технических причин, чтобы рекомендовать это. Что-то вроде этого:

proto/api/item.proto :

 syntax = "proto2";
package api.item;

import "proto/item.proto";

...
 

и генерировать с

 protoc 
    --proto_path=. 
    ... 
    proto/api/item.proto
 

Комментарии:

1. Спасибо, это было полезно. Основная проблема заключалась в том, что для двух файлов были указаны разные имена проектов. Изменился package api_item.item и package item.item к package api.api_item and package api.item .

2. Пожалуйста, я рад, что ваша проблема была решена