如何在每次切换到另一个选项卡时停止执行T4?

时间:2010-10-27 15:24:18

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

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

6 个答案:

答案 0 :(得分:12)

我有完全相同的问题。我按照本文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

#>

答案 1 :(得分:6)

T4连接到C#/ VB项目系统中的自定义工具机制(IVsSingleFileGenerator),这使它可以运行保存,运行自定义工具菜单以及运行选项卡切换行为 - 所有这些都用于实现简单界面的价格。

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

另一种方法是使用VS Modeling and Visualization SDK中的T4 MsBuild支持在构建时执行T4,然后禁用自定义工具。我会询问构建msbuild支持的同事,如果它使用自定义工具来识别模板集,并回发给帖子。

答案 2 :(得分:3)

我正在做的事情(可能是一个糟糕的方法)是在tt文件的开头写一个例外的例外行:

<# throw new Exception(); #>

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

答案 3 :(得分:2)

在编译指令之后立即尝试,添加一个返回exit方法

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

...

答案 4 :(得分:1)

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

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

如果保存T4时出现错误,则将显示它们,否则,将显示一条消息:

错误正在运行转换:System.Exception:引发了类型为'System.Exception'的异常。

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

答案 5 :(得分:0)

保存文件时执行T4模板。如果您有VS设置,当您选择可以解释该行为的文件时自动保存。检查您的VS配置以确定当您选择标签时VS是否正在保存文件。