# #c #go #grpc #proto
Вопрос:
Не могу понять, как делать импорт в прото, очень ценю некоторую помощь.
Структура файла:
- прото
- API
- пункт.прото
- пункт.прото
- 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. Пожалуйста, я рад, что ваша проблема была решена