为何ProjectB.csproj会重复添加ItemGroup?如何阻止该现象
为什么会自动添加这个ItemGroup?
这是Visual Studio(以及背后的MSBuild项目系统)的自动文件关联特性导致的。当你的生成文件采用GeneratedFile.*.cs这种命名格式时——比如常见的.Designer.cs、.Part.cs后缀——VS会默认把它们识别为GeneratedFile.cs的附属依赖文件(也就是DependentUpon节点的作用:在解决方案资源管理器里把这些文件折叠显示在主文件下面,让结构更清晰)。
每次Project A覆盖或重新生成这些文件时,VS的文件系统监视器会立刻检测到文件变化,自动扫描项目目录,然后更新ProjectB.csproj,添加对应的<Compile Update>节点来维护这个依赖关联。本质上是VS在帮你“优化”项目结构,但反而给你的自动化流程添了麻烦。
怎么阻止这个自动变更?
这里有几个实用的方案,你可以根据自己的需求选择:
修改生成文件的命名规则(最简单)
避开VS默认识别的附属文件命名模式就行,比如把GeneratedFile.*.cs改成GeneratedFile_1.cs、GeneratedFile_Extended.cs这类格式。这样VS不会把它们和GeneratedFile.cs绑定,自然就不会乱改你的.csproj了。显式在
.csproj里定义规则(推荐)
如果你想保留现有命名,直接在ProjectB.csproj里预先声明这些生成文件,并且禁用自动关联功能:<ItemGroup> <!-- 包含所有GeneratedFile开头的cs文件 --> <Compile Include="GeneratedFile.*.cs"> <!-- 不需要依赖关联就删掉下面这行;需要固定关联就保留 --> <!-- <DependentUpon>GeneratedFile.cs</DependentUpon> --> <!-- 关键:禁用自动生成依赖项 --> <AutoGenerateDependentUpon>false</AutoGenerateDependentUpon> </Compile> </ItemGroup>添加这段后,VS会优先遵循你显式配置的规则,不会再自动添加新的
Update节点。关闭VS的自动文件跟踪(不推荐)
这个方法比较激进:打开VS的Tools > Options,找到Projects and Solutions > General,取消勾选“Track file changes outside the environment”。但这样一来,你手动新增文件到项目目录时,VS也不会自动把它们加入项目了,所以除非万不得已,不建议用这个。
内容的提问来源于stack exchange,提问作者Slack Groverglow

