从不同项目导入原始文件非常棘手,我发现这个解决方案非常费力。所以我想与社区分享
我正在使用微服务架构,我希望我的消息 ProtoFiles 应该在 SharedProto 项目中并在不同的项目中使用它们
假设我在 SharedProto 中有消息 Proto 文件
SharedProto
--Protos
----company_dto.proto
----branch_dto.proto
---- ...
company_dto.proto的内容
syntax = "proto3";
option csharp_namespace = "SharedProto.Protos";
package sharedproto.protos;
// *** DTO
message CompanyDto {
int32 Id = 1;
string Code = 2;
string Name = 3;
string Logo = 4;
string Website = 5;
}
SharedProto.csproj 的内容
....
<ItemGroup>
<Protobuf Include="Protos\company_dto.proto" GrpcServices="None">
<Protobuf Include="Protos\branch_dto.proto" GrpcServices="None">
</ItemGroup>
....
我拥有服务原型的项目组织
Organization
...
--Protos
----company_rpc.proto
----branch_rpc.proto
...
我想将
comapany_dto.proto
(属于 SharedProto 项目的一部分)导入到 comapany_rpc.proto
(属于 Organization 项目的一部分)。让我们看看 .csproj
文件,因为所有的技巧都在这里:
组织.csproj的内容
<ItemGroup>
<ProjectReference Include="..\SharedProto\SharedProto.csproj">
<GlobalPropertiesToRemove></GlobalPropertiesToRemove>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<!-- DTOs -->
<Protobuf Include="..\SharedProto\Protos\company_dto.proto" ProtoRoot=".." GrpcServices="None" Link="Protos\company_dto.proto" />
<Protobuf Include="Protos\company_rpc.proto" AdditionalImportDirs="../SharedProto" GrpcServices="Server" />
</ItemGroup>
如果您看到上面的 Organzation.csproj 文件,那么您需要了解一些非常重要的要点,以避免
file not found error
从其他项目导入 proto 文件。
ProtoRoot=".."
和 Link="Protos\company_dto.proto"
之后,将此 AdditionalImportDirs="../SharedProto"
添加到要导入文件的 <Protobuf Include=....
上。但是,在这些设置之后,您可以在其他项目中导入 SharedProto 文件,在我的例子中它是组织项目。看看吧
company_rpc.proto内容
syntax = "proto3";
import "google/protobuf/empty.proto";
import "Protos/company_dto.proto";
package organization.companyrpc;
// *** Rpc-Service
service CompanyRpcService {
// Retrieve All
rpc GetAllCompanies (google.protobuf.Empty) returns (GetCompanyListResponse){
}
....
}
// Response: Retrieve All
message GetCompanyListResponse {
repeated sharedproto.protos.CompanyDto DtoRows = 1;
string Message = 2;
}
如果您看到我的
company_rpc.proto
文件,您就会了解我如何导入它(import "Protos/company_dto.proto";
)以及我如何使用它(sharedproto.protos.CompanyDto DtoRows
)
记住这个
sharedproto.protos
来自company_dto.proto文件中的包名称
上述设置适用于我的 .net core grpc 2.60.0 和 .net core 8