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

.NET 6运行测试时Tests目录递归生成bin/obj文件夹问题咨询

问题结论

这是项目配置错误导致的异常现象,不属于正常构建行为,根因是独立测试项目嵌套在主项目目录下,触发了MSBuild的循环拷贝逻辑。

具体成因
  • 你当前的目录结构不符合.NET项目的常规约定:独立的Tests项目没有和主项目main做目录隔离,而是作为子文件夹放在了main项目的根目录下。
  • main.csproj使用Microsoft.NET.Sdk.Web SDK,默认会自动递归纳入项目根目录下所有代码、内容文件到构建流程,最终拷贝到输出目录,当前配置没有排除Tests子文件夹。
  • 构建时会触发如下死循环:
    1. 构建主项目main,初始输出路径为main/bin/Debug/net6.0
    2. 主项目扫描到子目录Tests,将整个Tests文件夹拷贝到自身输出目录中
    3. 构建Tests项目时,由于它引用了主项目main,会把主项目的输出内容拷贝到自身的输出路径,此时主项目输出里已经包含了嵌套的Tests文件夹
    4. 拷贝流程反复触发,最终形成你看到的无限递归嵌套的bin/obj目录结构。
修复方案

二选一即可解决问题:

  • 调整目录结构(官方推荐做法)
    把Tests文件夹移动到main项目的目录范围外,保证两个项目的文件夹平级、互不嵌套即可。最通用的规范结构是把业务代码和测试代码分开放置:
    解决方案根目录/
    ├─ main.sln
    ├─ src/
    │  └─ main/
    │     ├─ main.csproj
    │     └─ 主项目业务代码
    └─ tests/
       └─ Tests/
          ├─ Tests.csproj
          └─ 测试代码
    
    移动后需要修正两处配置:一是解决方案文件里两个项目的相对路径,二是Tests.csproj里对main.csproj的项目引用路径,确保路径能正确对应到目标csproj文件即可。
  • 保留现有目录结构,修改主项目排除规则
    如果不想调整现有目录位置,直接在main.csproj中添加配置,显式让主项目构建时忽略Tests子文件夹的所有内容即可,添加的配置如下:
    <ItemGroup>
      <Compile Remove="Tests\**" />
      <Content Remove="Tests\**" />
      <None Remove="Tests\**" />
      <EmbeddedResource Remove="Tests\**" />
    </ItemGroup>
    
    配置添加完成后,先手动删除所有项目下已经生成的嵌套bin、obj文件夹,再重新生成解决方案即可。

额外优化提示:main.csproj中引用的xunit包是多余依赖,主项目不是测试项目,不需要引用这个包,可以直接删除对应的PackageReference节点,减少不必要的依赖加载。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:07:04