【问题标题】:proto importing from parent directory does not work从父目录导入 proto 不起作用
【发布时间】:2021-11-04 04:20:11
【问题描述】:

无法弄清楚如何在 proto 中进行导入,非常感谢一些帮助。

文件结构:

  • 原型
    • API
      • item.proto
    • item.proto

我正在尝试将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.

【问题讨论】:

    标签: c++ go grpc proto


    【解决方案1】:

    我假设您没有将包说明符添加到 proto/item.proto 文件中。请参阅 thisthis。如果您在导入的文件中指定一个包,您应该不会收到任何错误:

    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
    

    【讨论】:

    • 谢谢,这很有帮助。主要问题是为两个文件指定了不同的项目名称。将package api_item.itempackage item.item 更改为package api.api_item and package api.item
    • 不客气,很高兴您的问题得到解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2018-10-25
    • 1970-01-01
    • 2020-08-12
    • 2016-12-27
    相关资源
    最近更新 更多