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

GitHub Actions中.NET 6测试因LiteDB依赖缺失失败求助

.NET 6 GitHub Actions CI:LiteDB测试程序集缺失问题排查

问题场景

  • 多项目.NET 6解决方案,测试项目依赖LiteDB存储测试数据
  • 本地构建、测试完全正常;GitHub Actions(Ubuntu环境)构建成功,但依赖LiteDB的测试报错找不到LiteDB程序集
  • 尝试<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>无效;添加<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>后,LiteDB问题解决,但出现Microsoft.TestPlatform.CommunicationUtilities程序集缺失的新错误
  • 已确认LiteDB支持Linux,所有项目目标框架为.NET 6.0,构建平台AnyCPU

核心原因分析

  1. LiteDB依赖未被正确复制到测试输出目录:本地环境的依赖缓存或复制逻辑与CI环境存在差异,导致LiteDB.dll未出现在测试执行目录中
  2. CopyLocalLockFileAssemblies=true的副作用:该配置会强制复制所有NuGet依赖到输出目录,干扰了dotnet test对测试平台组件的自动加载逻辑——测试平台组件本应由命令从全局工具缓存调用,手动复制后易出现版本冲突或加载路径错误

解决方案

方案1:精准控制LiteDB的复制行为(推荐)

移除CopyLocalLockFileAssemblies=true,在测试项目的.csproj中针对LiteDB的NuGet引用设置强制复制规则:

<ItemGroup>
  <!-- 替换为你实际使用的LiteDB版本 -->
  <PackageReference Include="LiteDB" Version="5.0.17">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
</ItemGroup>

该配置会确保LiteDB的运行时文件被复制到测试输出目录,同时不影响其他依赖的默认加载逻辑。

方案2:优化GitHub Actions测试命令

确保CI流程中依赖还原、构建、测试步骤的顺序和参数正确,避免手动干预依赖加载:

jobs:
  build-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup .NET 6.0
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '6.0.x'
      
      - name: Restore dependencies
        run: dotnet restore
      
      - name: Build solution
        run: dotnet build --configuration Release --no-restore
      
      - name: Run all tests
        run: dotnet test --configuration Release --no-build --verbosity normal

关键:使用--no-build让dotnet test复用已构建的输出,避免重复构建导致的依赖路径混乱;--verbosity normal可输出更详细的加载日志,方便后续排查。

方案3:修复测试平台依赖冲突(若必须保留CopyLocalLockFileAssemblies=true)

如果因其他需求必须开启CopyLocalLockFileAssemblies=true,可单独排除测试平台相关依赖的复制:

<ItemGroup>
  <!-- 测试框架相关依赖设置为不复制到输出目录 -->
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2">
    <PrivateAssets>none</PrivateAssets>
  </PackageReference>
  <PackageReference Include="xunit" Version="2.4.2">
    <PrivateAssets>none</PrivateAssets>
  </PackageReference>
  <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
    <PrivateAssets>none</PrivateAssets>
  </PackageReference>
</ItemGroup>

这样测试平台组件会由dotnet test命令从全局缓存加载,避免本地复制的版本冲突。

辅助排查步骤

若以上方案无效,可在CI中添加步骤查看测试输出目录的文件结构,确认依赖是否存在:

- name: Inspect test output directory
  run: ls -la ./YourTestProject/bin/Release/net6.0/

通过该命令可直观看到LiteDB.dll和测试平台相关dll是否存在,进一步定位问题。


内容的提问来源于stack exchange,提问作者payetools-steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:40