用途:解决 MSBuild 构建过程中生成的文件被忽略的问题,例如生成文件未进入输出目录、生成的源代码未被编译、通配符未捕获构建期间创建的文件。
原因:MSBuild 分评估阶段与执行阶段。评估阶段读取项目、展开 Target 之外的通配符;执行阶段才运行 Target 与 Task。执行阶段生成的文件在评估时并不存在,因此默认不会被通配符捕获,尤其影响默认被通配的源文件(如 .cs)。
主要做法:在生成文件的 Target 内手动把文件加入相应项组。生成代码文件时加入 Compile 与 FileWrites,并把 Target 挂到 BeforeTargets="CoreCompile;BeforeCompile";非代码文件(配置、数据等)加入 None 或 Content 并设 CopyToOutputDirectory="PreserveNewest",挂到 BeforeTargets="BeforeBuild"。若 BeforeBuild 过早,可用 BeforeTargets="AssignTargetPaths" 作为兜底。
路径与清理:生成文件位置应始终以 $(IntermediateOutputPath) 为基准,不要硬编码 obj\ 或手工拼接中间路径,因为该路径在共享输出目录、CI 等配置下可能被重定向。每个生成文件都应加入 FileWrites,以便 Clean 目标正确删除,否则会跨构建累积为陈旧产物。
通配符行为:Target 之外的通配符只捕获评估阶段可见的文件;Target 之内的通配符在 Target 运行时求值,因此把 ItemGroup 放进 Target 内才能捕获生成文件。
限制:资料未提供具体生成逻辑、完整示例之外的命令、平台或版本要求,也未说明收费与效果保证。