如何正确管理 .NET 构建生成的文件:including-generated-files 完整指南
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
本指南详解dotnet/skills仓库(.NET 团队为 AI 编码助手打造的技能库)中的including-generated-files技能,教你解决 MSBuild 构建中生成文件被忽略的经典难题:为什么构建期生成的.cs文件不参与编译、为什么通配符(glob)抓不到这些文件、以及如何用Compile和FileWrites项组一步到位地修复。
为什么构建生成的文件"隐身"了?🤔
你有没有遇到过这种情况:
- 构建过程中明明生成了一个
.cs文件,编译器却报CS0246(找不到类型); - 生成的配置文件没有出现在输出目录;
- 项目里写了通配符
*.cs,构建时生成的文件却没被包含进来。
根源在于 MSBuild 的两个阶段分工不同:
| 阶段 | 发生的事 |
|---|---|
| 评估阶段(Evaluation) | 读取项目、展开项目外层的 Items 通配符 |
| 执行阶段(Execution) | 运行 Targets 和 Tasks,此时才真正生成文件 |
关键结论:文件在执行阶段才诞生,而通配符在评估阶段就已"定格",自然看不见它们。这也是为什么技能文档反复强调——<ItemGroup>必须放在<Target>内部声明,让 glob 在文件已生成之后执行。
一键修复:3 个关键步骤 ⚡
步骤 1:用$(IntermediateOutputPath)作为生成目录
永远不要硬编码obj\或手动拼接obj\$(Configuration)\$(TargetFramework)。某些构建配置(共享输出目录、CI 环境)会重定向中间路径,用$(IntermediateOutputPath)才能保证目标在任何环境下都正确。
步骤 2:把生成代码加入Compile项组
对于需要编译的.cs文件,在生成它的目标内加入Compile,并挂接正确的时间点:
<ItemGroup> <Compile Include="$(GeneratedFilePath)" /> <FileWrites Include="$(GeneratedFilePath)" /> </ItemGroup>步骤 3:注册FileWrites,让 Clean 替你清理 🧹
每个生成文件都应加入FileWrites项组,这样Clean目标会自动删除它们,避免 obj 目录里越攒越多的"僵尸文件"。
时机怎么选?BeforeTargets 速查表 📌
不同的文件类型要挂在不同的目标之前:
| 场景 | 推荐写法 | 说明 |
|---|---|---|
| 生成非代码文件(配置、数据) | BeforeTargets="BeforeBuild" | 加入None/Content,赶在拷贝输出之前 |
| 生成需要编译的源码 | BeforeTargets="CoreCompile;BeforeCompile" | 最稳妥:无论编译器目标如何被定制,都先于它执行 |
| 兜底方案 | BeforeTargets="AssignTargetPaths" | BeforeBuild太早时的"最后一站" |
💡 同时指定
CoreCompile;BeforeCompile两个目标,MSBuild 会在先出现的那个之前运行,这是技能文档推荐的稳健写法。
仓库里的完整示例项目 📂
这个仓库自带一个可直接运行的演示项目,用内联 C# 任务在构建时生成一个BuildInfo类,打印构建时间、机器名等信息:
- 技能正文:SKILL.md
- 示例项目文件:TestProject.csproj
- 示例入口代码:Program.cs
- 所属插件描述:plugin.json
打开示例的 TestProject.csproj,你会看到GenerateSampleCode目标完整演示了上文三步:定义$(IntermediateOutputPath)Generated\目录 → 内联任务写出GeneratedInfo.cs→ 挂接在CoreCompile;BeforeCompile之前。
这个技能是怎么被验证的?
仓库为每个技能配置了自动化评测(eval),由 AI 评审按评分细则逐项打分。以下截图展示了 dotnet skills 技能评测结果报表,可以看到每个技能相对基线的偏好度提升与质量评分:
including-generated-files的评测定义在 eval.yaml 中,它的评分细则要求回答必须:
- 指出生成文件未参与编译;
- 解释评估阶段 vs 执行阶段的时序差异;
- 给出将文件加入
Compile项组(且在<Target>内而非项目层级)的正确修复。
常见误区清单 ⚠️
- ❌ 在项目顶层(
<Target>外)用通配符去"兜"生成文件——评估阶段它还不存在; - ❌ 硬编码
obj\路径——换环境就失效; - ❌ 只用
BeforeBuild加Compile项——对某些 SDK 特性时序太早,不可靠; - ❌ 忘记
FileWrites——Clean后生成文件残留,脏文件越积越多。
这套技能位于 dotnet-msbuild 插件 下,与 binlog 故障分析、性能评估等 14 个 MSBuild 技能配套使用。如果你想在自己的 AI 编码助手中启用它,安装步骤见仓库主文档 README.md;需要本地完整体验时,可克隆仓库https://gitcode.com/GitHub_Trending/skills17/skills后按说明安装对应插件。
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考