You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 &quot;$(_TextTransformResult)&quot;" Condition="Exists('$(_TextTransformResult)')" />
  <!-- 仅当目标文件不存在,或者TT模板比生成文件新时才执行生成 -->
  <Exec Command="&quot;$(_TransformExe)&quot; &quot;$(_TextTransform)&quot; -out &quot;$(_TextTransformResult)&quot;" 
        Condition="!Exists('$(_TextTransformResult)') OR '$(_TextTransform)' &gt; '$(_TextTransformResult)'" />
</Target>

配置说明:

  • Condition="'$(DesignTimeBuild)' != 'true'":排除VS后台的设计时构建(比如项目加载、代码分析时的轻量构建),进一步避免误触发。
  • 文件存在/时间戳判断:避免每次构建都重复执行删除和生成操作,只有当模板更新或目标文件缺失时才运行,减少不必要的资源消耗。

内容的提问来源于stack exchange,提问作者TostMaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:35:13