You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项目共享gRPC Protobuf文件遇类型重复编译错误求助

解决gRPC契约项目共享Protobuf文件导致类型重复的问题

问题背景

在微服务架构中,将可复用的Protobuf消息放在单独的Contracts.Grpc项目,让多个业务契约项目(如Microservice1.Contracts.Grpc、Microservice2.Contracts.Grpc)通过链接方式引用这些共享文件后,微服务项目同时引用多个业务契约项目时,会出现The type 'Message' exists in both 'ProjA' and 'ProjB'的编译错误——原因是每个业务契约项目都会独立编译共享Protobuf文件,生成重复的C#类型。

可行解决方案

方案1:让共享契约项目独立编译生成类型(推荐)

将Contracts.Grpc从单纯的文件存储项目改为可编译的类库,统一生成共享类型,业务契约项目直接引用该类库而非链接文件:

  1. 给Contracts.Grpc项目安装Grpc.Tools和Google.Protobuf NuGet包,在其csproj中配置Protobuf编译:
    <ItemGroup>
      <Protobuf Include="*.proto" GrpcServices="None" />
    </ItemGroup>
    
    (GrpcServices="None"表示只生成消息类,不生成gRPC服务/客户端代码)
  2. 修改业务契约项目(如Microservice1.Contracts.Grpc):
    • 删除对共享Protobuf文件的链接配置
    • 添加对Contracts.Grpc项目的引用
    • 在自身的业务Protobuf文件中通过import导入共享消息,例如:
      import "entities.proto";
      
    • 在csproj中配置Protobuf的导入目录,确保protoc能找到共享的proto文件:
      <ItemGroup>
        <Protobuf Include="microservice2_connection.proto" GrpcServices="Client">
          <AdditionalImportDirs>$(SolutionDir)Contracts.Grpc</AdditionalImportDirs>
        </Protobuf>
      </ItemGroup>
      
  3. 微服务项目(如Microservice1)只需引用业务契约项目和Contracts.Grpc项目,即可获取所有所需类型,且不会出现重复定义。

方案2:业务契约项目仅编译自身业务Protobuf,排除共享文件编译

保持Contracts.Grpc作为文件存储项目,但让业务契约项目仅编译自身的业务Protobuf,共享文件仅用于导入解析不编译:

  1. 在业务契约项目的csproj中,将共享Protobuf文件的BuildAction设为None(仅链接不编译),同时配置自身业务Protobuf的编译和导入目录:
    <ItemGroup>
      <!-- 链接共享文件但不编译 -->
      <None Include="..\Contracts.Grpc\entities.proto" Link="entities.proto" />
      <None Include="..\Contracts.Grpc\common.proto" Link="common.proto" />
      
      <!-- 编译自身业务Protobuf,并指定共享文件的导入目录 -->
      <Protobuf Include="microservice2_connection.proto" GrpcServices="Client">
        <AdditionalImportDirs>$(SolutionDir)Contracts.Grpc</AdditionalImportDirs>
      </Protobuf>
    </ItemGroup>
    
  2. 微服务项目需要同时引用业务契约项目和Contracts.Grpc项目,以获取共享类型和业务生成的gRPC客户端/服务代码。

方案对比

  • 方案1结构清晰,共享类型统一维护,避免重复编译,是最推荐的方式。
  • 方案2适合不想修改Contracts.Grpc项目定位的场景,但需要微服务项目额外引用共享契约项目,维护成本略高。

内容的提问来源于stack exchange,提问作者TondaMarko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:08