Importing .proto files from another project

荒凉一梦 提交于 2020-01-24 17:14:09

问题


I have several contract projects that contains different protobuf files, but some of the message types have the same message type like

message user 
{
  Address address  = 1
}

message Address 
{
....
}

I have now created a shared project and added an Address.proto file to it only containing

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

My problem is to figure out how to import it into the protos in my different contract projects. I have added the shared project as a reference, but everything else that I have tried from there has resultet in errors.

I know that I need to use import just haven't figured out how to write the string.

Update

I'm using gRPC.tools nuget and all .proto files is set to protobuf compiler both

The files structure is as following

User.Contracts project - Protos -- User.proto Shared project - Protos -- Address.proto

both projects is in it's own folder and those folders are placed next to each other.

in the shared project it says

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

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

and in the user.contract is says

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

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

Thanks in advance


回答1:


You can do so by adding the ProtoRoot attribute to the <Protobuf /> section in your .csproj file.

Let's say you have a .proto file in project A:

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

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

In project B you have:

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

message Engine {
    ...
}

As you can see, in car.proto we used an import statement to a .proto file from another project. In order to successfully import this file, we need to add ProtoRoot to the <Protobuf /> section in the .csproj file of the project A:

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

<path> is equivalent to your folder structure within your C# project. ProtoRoot needs to be set to the directory where import declarations in the .proto files are looking for files. In this case, it's the parent folder which contains two subfolders with project A and project B.

More interesting stuff can be found here: https://chromium.googlesource.com/external/github.com/grpc/grpc/+/HEAD/src/csharp/BUILD-INTEGRATION.md



来源:https://stackoverflow.com/questions/59422186/importing-proto-files-from-another-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!