MSBuild生成文件最新检查失效,项目重复构建问题求助
解决T4生成文件导致的MSBuild增量构建反复触发问题
以下是可行的csproj配置修改方案,既能保证生成文件被编译,又能避免增量构建误判:
步骤1:重构T4生成目标为增量构建
替换原有的TextTemplateTransform目标,添加输入输出关联,让MSBuild仅在T4模板文件变更时才重新生成代码:
<ItemGroup> <!-- 定义T4模板文件项 --> <TextTemplate Include="**/*.tt" Exclude="**/*.generated.tt" /> <!-- 关联模板与生成文件的映射 --> <TextTemplateOutput Include="%(TextTemplate.RelativeDir)%(TextTemplate.FileName).generated.cs" /> </ItemGroup> <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild" Inputs="@(TextTemplate)" Outputs="@(TextTemplateOutput)"> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 "%(TextTemplate.FullPath)" -P="$(ProjectDir)..\TextTemplating" -I="$(ProjectDir)..\TextTemplating"" /> </Target>
步骤2:正确排除生成文件的增量检查
将生成文件从UpToDateCheckBuilt中移除,同时确保它们仍被纳入编译:
<ItemGroup> <!-- 确保生成文件被编译 --> <Compile Include="**/*.generated.cs" /> <!-- 从增量构建检查中排除生成文件 --> <UpToDateCheckBuilt Remove="**/*.generated.cs" /> </ItemGroup>
原配置无效的原因
- 原
UpToDateCheck*的通配符未正确匹配文件路径(比如相对路径与绝对路径的差异),改用递归通配符**/*.generated.cs更可靠。 - 原目标未设置
Inputs和Outputs,导致MSBuild无法判断是否需要重新执行生成操作,每次构建都会修改生成文件,触发增量检查误判。
注意:不要使用<Compile Remove="*.generated.cs"/>,这会直接将生成文件排除在编译范围外,不符合需求。
内容的提问来源于stack exchange,提问作者Daniel S
相关产品推荐
相关产品推荐

