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

多仓库ASP.NET Core API解决方案依赖冲突问题排查

解决ASP.NET Core多仓库类库的依赖冲突与本地调试复用矛盾

一、处理NU1106依赖冲突问题

NU1106本质是不同类库的NuGet包引用了第三方库的不同版本,导致API项目无法统一版本。可以通过以下方式解决:

  • 集中管控第三方依赖版本:在API项目根目录创建Directory.Build.props文件,统一声明所有第三方库的版本,强制所有类库继承这个版本:
    <Project>
      <PropertyGroup>
        <MicrosoftIdentityModelVersion>6.32.2</MicrosoftIdentityModelVersion>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Update="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="$(MicrosoftIdentityModelVersion)" />
        <!-- 其他冲突的第三方库都在这里统一版本 -->
      </ItemGroup>
    </Project>
    
    这样所有类库(不管是项目引用还是NuGet引用)都会使用这个统一版本,避免版本冲突。
  • 检查类库的NuSpec文件:确保每个类库的NuSpec里没有硬编码第三方依赖的版本,或者使用浮动版本(比如[6.0,7.0)),但更推荐集中管控版本。

二、解决“NuGet复用性+本地调试修改”的矛盾需求

你的核心需求并不冲突,只需要通过条件性引用切换实现本地用项目引用、发布/CI用NuGet引用的方案:

1. 配置API项目的条件引用

修改API项目的.csproj文件,通过环境变量或编译条件切换引用方式:

<Choose>
  <!-- 本地开发时用项目引用,直接修改调试 -->
  <When Condition="'$(LocalDev)' == 'true'">
    <ItemGroup>
      <ProjectReference Include="..\MyProject.Core\MyProject.Core.csproj" />
      <ProjectReference Include="..\MyProject.Infrastructure\MyProject.Infrastructure.csproj" />
      <ProjectReference Include="..\MyProject.Business\MyProject.Business.csproj" />
      <ProjectReference Include="..\MyProject.Frontend\MyProject.Frontend.csproj" />
    </ItemGroup>
  </When>
  <!-- CI/发布时用NuGet引用,保证复用性 -->
  <Otherwise>
    <ItemGroup>
      <PackageReference Include="MyProject.Core" Version="1.0.*" />
      <PackageReference Include="MyProject.Infrastructure" Version="1.0.*" />
      <PackageReference Include="MyProject.Business" Version="1.0.*" />
      <PackageReference Include="MyProject.Frontend" Version="1.0.*" />
    </ItemGroup>
  </Otherwise>
</Choose>

本地调试时,在终端执行dotnet build /p:LocalDev=true,或者在IDE的项目属性里添加LocalDev=true的编译常量,就能直接引用本地类库项目,修改代码后即时生效。

2. 本地多仓库的工作区管理

为了让API项目能找到本地的类库项目,建议:

  • 把四个类库仓库和API项目放在同级目录下,比如:
    Workspace/
    ├─ MyProject.Api/
    ├─ MyProject.Core/
    ├─ MyProject.Infrastructure/
    ├─ MyProject.Business/
    └─ MyProject.Frontend/
    
  • 用Git子模块(Git Submodules)管理这些仓库,执行以下命令把类库仓库作为子模块加入API项目的工作区:
    git submodule add https://github.com/your-org/MyProject.Core.git ../MyProject.Core
    # 其他类库同理
    
    这样克隆API项目时可以一次性拉取所有类库代码,方便本地调试。

3. CI流程的联动更新

当某个类库提交代码后,自动触发依赖它的其他类库更新NuGet版本并重新打包:

  • 在每个类库的GitHub Action中,添加触发后续依赖仓库的逻辑:比如当MyProject.Core构建完成后,调用GitHub API触发MyProject.Infrastructure的Workflow,自动更新MyProject.Core的NuGet版本号,然后重新构建打包。
  • 最后触发API项目的Workflow,更新所有类库的NuGet版本并构建发布。

三、原方案的问题点

你之前的方案矛盾在于:API用项目引用类库,但类库之间用NuGet引用,导致本地调试时,类库之间的依赖无法直接同步修改(必须打包更新NuGet),同时类库的第三方依赖版本无法和API统一,引发NU1106冲突。通过条件引用切换,就能同时满足复用性和本地调试的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:37:14