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
核心原因分析
- LiteDB依赖未被正确复制到测试输出目录:本地环境的依赖缓存或复制逻辑与CI环境存在差异,导致LiteDB.dll未出现在测试执行目录中
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
相关产品推荐
相关产品推荐

