【问题标题】:Importing proto file from different package从不同的包导入 proto 文件
【发布时间】:2019-03-10 06:21:31
【问题描述】:

我有两个服务:Story 和 Tag。这些文件的结构如下:

Story
|-- StoryService
|   `-- proto
|       `-- storyservice.proto
`-- TagService
    `-- proto
        `-- tagservice.proto

每个.proto 文件都需要使用来自另一个文件的消息。如何将它们相互导入? 我试过import "StoryService/proto/storyservice.proto",但没用。

【问题讨论】:

    标签: grpc protoc


    【解决方案1】:

    如果您使用protoc,则导入指令的所有搜索路径都应与-I (--proto_path) 参数中列出的文件夹之一相关。例如。如果你运行protoc -I/path/to/Story --go_out=out StoryService/proto/storyservice.proto,它将能够导入TagService/proto/tagservice.proto(因为它的路径是相对于Story文件夹,它在-I中列出)。

    话虽如此,您实际上并不需要让每个 proto 文件都导入另一个。递归 proto 文件导入将无法使用类似于此的错误消息:

    a.proto: File recursively imports itself: a.proto -> b.proto -> a.proto
    

    【讨论】:

    • 使用另一个文件中定义的消息怎么样?例如,在storyservice.proto 中,我想使用tagservice.proto 中定义的Tag 消息。 IDE 抱怨 Tag 未定义。
    • 如果您从storyservice.proto 导入tagservice.proto 并在storyservice.proto 中使用tagservice.proto 中定义的消息,应该没有问题。如果您只是使用protoc 将您的 protos (protoc -I/path/to/Story --go_out out StoryService/proto/storyservice.proto) 编译为源代码,没有 IDE,它是否可以工作,或者它会打印什么错误消息?
    • 现在它告诉我我导入了 proto 文件,但它没有被使用。但是当我尝试使用该文件中的消息时,它显示“故事”未定义。 PS:我正在将storyservice.proto导入tagservice.proto。
    【解决方案2】:

    您不能将两个 proto 文件相互导入。 您的方案有两种解决方案。 1. 拥有包含所有共享定义的第三个 proto 文件。 2. 将所有共享定义放入您拥有的两个原型之一中,这样一个可以导入另一个。

    【讨论】:

    • 这就是我最终要做的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多