问题
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