【问题标题】:How to stop T4 from executing every time I switch to another tab?每次切换到另一个选项卡时如何阻止 T4 执行?
【发布时间】:2011-05-01 09:32:06
【问题描述】:

当我编辑 T4 时,每次切换到另一个文件时都会执行脚本。快速简单的脚本是可以的,但有些脚本需要很长时间才能执行。有没有办法禁用这种行为?我希望脚本仅在我保存 T4 文件或从菜单中手动选择“运行自定义工具”时运行。

【问题讨论】:

    标签: c# visual-studio code-generation t4 customtool


    【解决方案1】:

    T4 模板在文件保存时执行。如果您将 VS 设置为在您从可以解释该行为的文件中跳出时自动保存。检查您的 VS 配置以确定 VS 是否在您离开时保存文件。

    【讨论】:

    • 问题是,这个设置在哪里?
    • -1 这是不正确的信息。切换选项卡时,T4 模板会自动执行,即使选项卡名称中仍有“*”,表示文件未保存。
    【解决方案2】:

    T4 与 C#/VB 项目系统中的自定义工具机制 (IVsSingleFileGenerator) 相连,这使其能够在保存时运行、运行自定义工具菜单以及在选项卡上切换行为 - 所有这些都以实现一个简单的接口。

    不幸的是,这意味着 T4 也基本上无法控制这些行为,这是自定义工具的标准。

    另一种方法可能是使用 VS 建模和可视化 SDK 中的 T4 MsBuild 支持在构建时执行 T4,然后禁用自定义工具。我会询问构建 msbuild 支持的同事是否使用自定义工具来识别模板集并发回线程。

    【讨论】:

    • 我使用 T4 Toolbox 生成多个文件,从而修改解决方案。我不确定它是否会在 MsBuild 中工作。无论如何,仅在构建时运行 T4 对我来说不是一个选项,我想在保存 T4 文件时立即看到结果。但是,欢迎您为发现此问题的其他人提供有关使用 MsBuild 的信息。这可能对他们有用。
    • 我明白了——我们还没有尝试过整合这两者——奥列格可能已经做到了。我只是确认 msbuild 不再需要自定义工具,但是您需要将 csproj/vbproj 文件中的项目类型从 None/Compile 更改为 T4Transform 或 T4Preprocess。输出文件将不再是您项目的一部分。有可以将它们重定向到中间 obj 文件夹或类似位置的元数据。
    【解决方案3】:

    我遇到了完全相同的问题。我按照本文http://msdn.microsoft.com/en-us/library/ee789839.aspx 中的步骤将模板拆分到另一个项目中并共享输出文件。

    详细说明如何通过右键单击模板并清除 CustomTool 属性来关闭附加到模板的 TextTemplatingFileGenerator 工具。这会在保存时停止模板生成代码......但在切换标签时它仍然运行!

    我认为解决此问题的唯一方法是将所有模板代码移动到具有不同后缀(如 ttinclude 或 t4 或其他内容)的新文件中,然后使用 include 将此文件包含在您的实际 T4 模板文件中指示。这样,您将永远不需要打开该文件来编辑模板,因此它不会意外运行。

    所以在一个名为 MyTemplate.tt 的文件中:

    <#@ template language="VB" debug="false" hostspecific="true"#>
    <#@ include file="Include\MyTemplateCodeBehind.t4" #>
    <#@ output extension=".vb"#>
    <# ' Nothing to see here! #>
    

    在另一个名为 MyTemplateCodeBehind.t4 的文件中:

    <#@ template language="VB" debug="false" hostspecific="true"#>
    <#
       For Each something In somecollection
    #>
       <#= something.PrintMyCode() #>
    <#
       Next
    
    #>
    

    【讨论】:

      【解决方案4】:

      在编译指令之后尝试,添加一个返回退出方法

      <#@ template language="C#" debug="false" hostspecific="true"#>
      <#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
       output extension="Repository.cs"#><#
      return string.Empty;     //<-- add this line!!! 
      

      ...

      【讨论】:

        【解决方案5】:

        我正在做的(可能是一个不好的方法)是在 tt 文件的开头写一个异常行,如:

        <# throw new Exception(); #>
        

        因为我抛出了一个异常,所以进程停止了,当我完成所有工作时,我只需要删除这一行。 :)

        【讨论】:

          【解决方案6】:

          我发现在开发 T4 模板时使用 T4 文件顶部的以下代码 sn-p 很有用:

          <# //throw exception to halt execution during development
              throw new Exception();
          #>
          

          如果保存T4时出现错误,则会显示,否则显示消息:

          错误运行转换:System.Exception:抛出了“System.Exception”类型的异常。

          然后在您准备好实际生成 T4 输出时将异常注释掉。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多