Visual Studio反复触发MSBuild Target:仅构建时执行文本模板
解决Visual Studio中TT模板频繁自动执行的问题
你的问题根源在于ResolveProjectReferences这个Target会被Visual Studio后台的增量构建、项目同步、IntelliSense更新等操作频繁触发,导致TransformOnBuild反复执行,进而出现AssemblyInfo.cs频繁消失重现的情况。以下是可行的替代方案和优化建议:
一、选择合适的Target替代ResolveProjectReferences
1. 使用BeforeTargets="Build"
这是最常用的方案,只有当你手动触发项目构建(比如按Ctrl+Shift+B、右键项目选择「构建」)时才会执行该Target,VS后台的轻量操作不会触发Build目标。
2. 使用BeforeTargets="Rebuild"
如果只需要在重建项目时更新AssemblyInfo.cs,这个Target更严格,仅在手动触发「重建」操作时运行,适合不需要每次普通构建都更新的场景。
3. 使用BeforeTargets="PreBuildEvent"
PreBuildEvent默认仅在手动构建时执行,后台构建不会触发,效果和Build类似,也是可靠的选择。
二、优化配置避免无意义执行
除了更换Target,建议添加条件判断,仅在必要时执行删除和生成操作,减少CPU负载和文件波动:
<Target Name="TransformOnBuild" BeforeTargets="Build" Condition="'$(DesignTimeBuild)' != 'true'"> <PropertyGroup> <_TransformExe>$(MSBuildExtensionsPath)\..\Common7\IDE\TextTransform.exe</_TransformExe> <_TextTransform>$(ProjectDir)AssemblyInfo.tt</_TextTransform> <_TextTransformResult>$(ProjectDir)AssemblyInfo.cs</_TextTransformResult> </PropertyGroup> <!-- 仅当目标文件存在时才执行删除 --> <Exec Command="del "$(_TextTransformResult)"" Condition="Exists('$(_TextTransformResult)')" /> <!-- 仅当目标文件不存在,或者TT模板比生成文件新时才执行生成 --> <Exec Command=""$(_TransformExe)" "$(_TextTransform)" -out "$(_TextTransformResult)"" Condition="!Exists('$(_TextTransformResult)') OR '$(_TextTransform)' > '$(_TextTransformResult)'" /> </Target>
配置说明:
Condition="'$(DesignTimeBuild)' != 'true'":排除VS后台的设计时构建(比如项目加载、代码分析时的轻量构建),进一步避免误触发。- 文件存在/时间戳判断:避免每次构建都重复执行删除和生成操作,只有当模板更新或目标文件缺失时才运行,减少不必要的资源消耗。
内容的提问来源于stack exchange,提问作者TostMaster
相关产品推荐
相关产品推荐

