我有几个合同项目,其中包含不同的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>
预先感谢
答案 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”中创建类文件。