在.proto文件中使用导入时出错

Aar*_*esh 33 import protocol-buffers

我尝试使用import语句将名为test1.proto的proto文件导入另一个名为test2.proto的proto文件

import "com/test/test1.proto";
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误

com/test/test1.proto: File not found.
test2.proto: Import "com/test/test1.proto" was not found or had errors.
Run Code Online (Sandbox Code Playgroud)

我试图在很多方面找到导入错误的原因,但不能.那么有人可以告诉我正确的方法进行原型文件导入,以防上述声明出现问题吗?

Ken*_*rda 36

您必须使用--proto_path命令行标志(aka -I)来告知protoc在哪里查找.proto文件.如果您不提供路径,则默认情况下它只会搜索当前目录.请参阅文档(在页面末尾的"生成您的类"下)或键入protoc --help.

  • 如果您的proto文件是`foo/bar/baz/qux.proto`,那么你的`--proto_path`可以是`.`,`foo`,`foo/bar`或`foo/bar中的任何一个./baz`,但它_cannot_不是`corge`也不能是`/ absolute/path/to/foo/bar/baz`等,因为它们不是文件名的前缀.我们的想法是proto路径应该指定你的"顶级源目录",即所有导入相对的目录.因此,如果您将此文件导入为"import"baz/qux.proto"`那么您的原型路径应为`foo/bar`. (16认同)
  • 这意味着导入语句中是否应该单独提及原始文件名?我很困惑,因为在尝试使用导入执行时出现以下错误“文件不驻留在使用 --proto_path (或 -I)指定的任何路径中。您必须指定包含此文件的 --proto_path。请注意,proto_path必须是 .proto 文件名的精确前缀——protoc 太笨了,无法弄清楚两个路径(例如绝对路径和相对路径)何时相等(这比你想象的更难)。”.. 请澄清 (2认同)

Chi*_*obe 22

补充一点,如果你是为 .NET 构建和/或你是 Visual Studio,你可以在 .csproj 文件中的 proto 文件定义中添加一个额外的属性来指定 Proto Root,如下所示:

<Protobuf Include="Protos\ProtoFile.proto" GrpcServices="None" ProtoRoot="Protos\" /> 
Run Code Online (Sandbox Code Playgroud)

这将清除所有导入和相关错误。

  • 对于仍然困惑的人来说,ProtoRoot 还必须是 Include 路径的前缀。ProtoRoot 应该只是从 .csproj 到 protos 目录的相对路径。完成此操作后,您可以直接导入另一个原型,例如 import "base.proto"; 在其他一些原型中,只要它们共享相同的目录和包。 (2认同)

Ash*_*ada 11

如果您正在使用IntelliJ IDEA,请转到首选项 - > Protobuf支持并添加.proto文件路径.这将解决错误.