.NET 6运行测试时Tests目录递归生成bin/obj文件夹问题咨询
问题结论
这是项目配置错误导致的异常现象,不属于正常构建行为,根因是独立测试项目嵌套在主项目目录下,触发了MSBuild的循环拷贝逻辑。
具体成因
- 你当前的目录结构不符合.NET项目的常规约定:独立的
Tests项目没有和主项目main做目录隔离,而是作为子文件夹放在了main项目的根目录下。 main.csproj使用Microsoft.NET.Sdk.WebSDK,默认会自动递归纳入项目根目录下所有代码、内容文件到构建流程,最终拷贝到输出目录,当前配置没有排除Tests子文件夹。- 构建时会触发如下死循环:
- 构建主项目
main,初始输出路径为main/bin/Debug/net6.0 - 主项目扫描到子目录
Tests,将整个Tests文件夹拷贝到自身输出目录中 - 构建
Tests项目时,由于它引用了主项目main,会把主项目的输出内容拷贝到自身的输出路径,此时主项目输出里已经包含了嵌套的Tests文件夹 - 拷贝流程反复触发,最终形成你看到的无限递归嵌套的bin/obj目录结构。
- 构建主项目
修复方案
二选一即可解决问题:
- 调整目录结构(官方推荐做法)
把Tests文件夹移动到main项目的目录范围外,保证两个项目的文件夹平级、互不嵌套即可。最通用的规范结构是把业务代码和测试代码分开放置:
移动后需要修正两处配置:一是解决方案文件里两个项目的相对路径,二是解决方案根目录/ ├─ main.sln ├─ src/ │ └─ main/ │ ├─ main.csproj │ └─ 主项目业务代码 └─ tests/ └─ Tests/ ├─ Tests.csproj └─ 测试代码Tests.csproj里对main.csproj的项目引用路径,确保路径能正确对应到目标csproj文件即可。 - 保留现有目录结构,修改主项目排除规则
如果不想调整现有目录位置,直接在main.csproj中添加配置,显式让主项目构建时忽略Tests子文件夹的所有内容即可,添加的配置如下:
配置添加完成后,先手动删除所有项目下已经生成的嵌套bin、obj文件夹,再重新生成解决方案即可。<ItemGroup> <Compile Remove="Tests\**" /> <Content Remove="Tests\**" /> <None Remove="Tests\**" /> <EmbeddedResource Remove="Tests\**" /> </ItemGroup>
额外优化提示:main.csproj中引用的xunit包是多余依赖,主项目不是测试项目,不需要引用这个包,可以直接删除对应的PackageReference节点,减少不必要的依赖加载。
内容的提问来源于stack exchange,提问作者himynameisgarch
相关产品推荐
相关产品推荐

