从另一个项目导入.proto文件

时间:2019-12-20 08:41:41

标签: c# visual-studio protocol-buffers

我有几个合同项目,其中包含不同的protobuf文件,但是某些消息类型具有相同的消息类型,例如

message user 
{
  Address address  = 1
}

message Address 
{
....
}

我现在创建了一个共享项目,并向其中添加了一个Address.proto文件,仅包含

syntax = "proto3"
option csharp_namespace = "shared.protos"
package AddressPackage
message Address {....}

我的问题是弄清楚如何在我的不同合同项目中将其导入原型。 我已经添加了共享项目作为参考,但是从那里尝试的所有其他操作都导致结果集出错。

我知道我需要使用import,只是还没有弄清楚如何编写字符串。

更新

我正在使用gRPC.tools nuget,所有.proto文件都设置为protobuf编译器

文件结构如下

User.Contracts项目 -原始人 -User.proto 共享项目 -原始人 -Address.proto

两个项目都在其自己的文件夹中,并且这些文件夹彼此相邻放置。

在共享项目中显示

<ItemGroup>
  <None Remove="Protos\Address.proto" />
</ItemGroup>

<ItemGroup>
    <Protobuf Include="Protos\Address.proto">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Protobuf>
  </ItemGroup>

并在user.contract中说

  <ItemGroup>
    <None Remove="Protos\User.proto" />
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="Protos\User.proto" />
  </ItemGroup>

预先感谢

3 个答案:

答案 0 :(得分:3)

您可以通过将ProtoRoot属性添加到<Protobuf />文件中的.csproj部分来实现。

假设您在项目A中有一个.proto文件:

syntax = "proto3";
option csharp_namespace = "Project.A";
import "ProjectB/<path>/Engine.proto"

message Car {
    Engine engine = 1;
    ...
}

在项目B中,您具有:

syntax = "proto3";
option csharp_namespace = "Project.B";

message Engine {
    ...
}

如您所见,在car.proto中,我们使用了另一个项目中的.proto文件的import语句。为了成功导入此文件,我们需要将ProtoRoot添加到项目A的<Protobuf />文件的.csproj部分中:

<ItemGroup>
  <Protobuf Include="ProjectA/<path>/car.proto" Link="<path>/car.proto" ProtoRoot=".." />
</ItemGroup>

<path>等效于C#项目中的文件夹结构。需要将ProtoRoot设置为.proto文件中的导入声明正在寻找文件的目录。在这种情况下,它是父文件夹,其中包含项目A和项目B的两个子文件夹。

更多有趣的东西可以在这里找到: https://chromium.googlesource.com/external/github.com/grpc/grpc/+/HEAD/src/csharp/BUILD-INTEGRATION.md

答案 1 :(得分:1)

另一种选择。不使用共享项目更容易。 .proto 文件只需要放在服务项目中并指定

<ItemGroup>
    <Protobuf Include="Protos\address.proto" GrpcServices="Server" />
</ItemGroup>

而在项目中客户只需要像这样指定链接

<ItemGroup>
    <Protobuf Include="..\NameServerProject\Protos\address.proto" GrpcServices="Client">
        <Link>Protos\address.proto</Link>
    </Protobuf>
</ItemGroup>

ProtoRoot 可能会错过。

答案 2 :(得分:0)

在您的项目中,使用 Include 和 ProtoRoot 指定 Protobuf,其中应包含共享项目的路径,如

  <ItemGroup>
    <Protobuf Include="..\NameSharedProject\Protos\address.proto" ProtoRoot="..\NameSharedProject" GrpcServices="Server" />
  </ItemGroup>

然后,在每个项目中构建后,您将在文件夹“\obj\Debug\net5.0\Protos”中创建类文件。