从不同目录导入proto文件

Bek*_*uma 9 c# visual-studio grpc

我正在努力为 grpc 导入编写正确的配置。

所以.net解决方案结构如下:
\Protos\Common\common.proto
\Protos\Vehicle\car.proto
\CarMicroservice

在 car.proto 里面我有:import "common.proto"

我想要的是生成的 grpc 代码位于项目CarMicroservice 内。
在 CarMicroservice.csproj 内部,我编写了原型的路径:

<Protobuf Include="common.proto" ProtoRoot="..\Protos\Common\" />
<Protobuf Include="car.proto" ProtoRoot="..\Protos\Vehicle\" />
Run Code Online (Sandbox Code Playgroud)

但出现错误:“common.proto”没有这样的文件或目录

问题是:如何在 car.proto 中正确导入 common.proto?

注意:我已经研究过类似的问题,但无法使其适用于我的案例
从另一个项目导入 .proto 文件

Bek*_*uma 11

好吧,我终于解决了这个问题。@DazWilkin 也指出了这一点。

  1. 您不能在 中使用相对路径import,因此您应该使用项目的绝对路径。就我而言,是:import "Common/common.proto"
  2. 使用项目根目录作为 proto 文件的位置。 所以现在有趣的部分来了,而不是ProtoRoot="..\Protos\Common\"使用。 由于某种原因,当我在 ProtoRoot 路径中使用反斜杠时, 我收到了“文件未找到”错误。因此不要使用反斜杠作为路径。CarMicroservice.csproj中的最终代码如下:ProtoRoot="../Protos/"

    "..\Protos\
<Protobuf Include="Common/common.proto" ProtoRoot="../Protos/" />
<Protobuf Include="Vehicle/car.proto" ProtoRoot="../Protos/" />
Run Code Online (Sandbox Code Playgroud)


Ars*_*001 5

或者,还有另外两种方法来指定protoc.

首先,有一个名为 的全局属性Protobuf_AdditionalImportsPath.csproj如果您在/中指定此属性.fsproj,它将传递给该项目中的protoc每个属性.proto。你可以这样使用它:

<PropertyGroup>
    <Protobuf_AdditionalImportsPath>../../my/other/directory</Protobuf_AdditionalImportsPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

AdditionalImportDirs您还可以直接在元素上指定一个属性<Protobuf>。这可能只对.proto您指定的 s 有效:

<Protobuf Include="MyProto.proto" Link="MyProto.proto" AdditionalImportDirs="../../my/other/directory" />
Run Code Online (Sandbox Code Playgroud)

请记住,在这两种情况下,您都可以指定所需的任何目录,无论它是否是.proto您正在编译的目录的父目录。

另请记住,您在.proto需求中指定的导入路径相对于您指定的导入目录之一。