从不同目录导入原型文件

时间:2020-08-18 14:31:07

标签: 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\" />

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

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

注意:我已经研究过类似的问题,但无法使其适用于我的情况
Importing .proto files from another project

2 个答案:

答案 0 :(得分:1)

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

  1. 您不能在import中使用相对路径,因此应使用项目的绝对路径。以我为例:import "Common/common.proto"
  2. 使用项目根目录作为原型文件的位置。因此,使用ProtoRoot="..\Protos\Common\"代替ProtoRoot="../Protos/"
    现在是有趣的部分。
    由于某些原因,当我将ProtoRoot路径的反斜杠用作"..\Protos\
    我收到“找不到文件”错误。因此,请勿将反斜杠用作路径。 CarMicroservice.csproj中的最终代码如下:
<Protobuf Include="Common/common.proto" ProtoRoot="../Protos/" />
<Protobuf Include="Vehicle/car.proto" ProtoRoot="../Protos/" />

答案 1 :(得分:0)

或者,还有另外两种方法可以为 protoc 指定包含目录。

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

<PropertyGroup>
    <Protobuf_AdditionalImportsPath>../../my/other/directory</Protobuf_AdditionalImportsPath>
</PropertyGroup>

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

<Protobuf Include="MyProto.proto" Link="MyProto.proto" AdditionalImportDirs="../../my/other/directory" />

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

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