用途:识别多个 MSBuild 项目求值共享同一 OutputPath 或 IntermediateOutputPath 的情况,这是并行构建文件冲突、输出被覆盖、偶发构建失败及 NuGet 还原报“Cannot create a file when that file already exists”的常见根因。
主要能力:通过二进制日志(.binlog)分析,列出所有项目与求值,比较各求值的 OutputPath、IntermediateOutputPath、BaseOutputPath、BaseIntermediateOutputPath,并使用 double_writes 工具检测多实例写入同一文件,从而定位冲突。
使用方式:先依据 binlog-generation 技能生成二进制日志;优先使用 binlog MCP 的结构化工具查询概览、项目、求值、全局属性和属性,不得直接读取 .binlog。若 MCP 不可用,可回退为文本日志:dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log",再检索输出路径、求值次数和全局属性。
忽略规则:分析冲突时应排除 BuildProjectReferences=false 的 P2P 引用解析求值;对 OutputPath 还应排除 MSBuildRestoreSessionId 还原求值。
适用场景:多目标框架未在路径中包含 TargetFramework、多个项目显式共享中间输出目录、RID 构建未包含 RuntimeIdentifier、同一构建中多个解决方案编译同一项目、额外全局属性(如 PublishReadyToRun、_IsPublishing)产生冗余实例,以及 SetTargetFramework 重复注入单目标项目自身 TFM 的情形。
限制:无法修复共享 BaseIntermediateOutputPath 导致的 NuGet 文件直接写入冲突,需要为每个项目使用唯一中间输出路径;具体修复方式取决于项目配置,资料未提供通用一键修复。