【发布时间】:2011-05-01 09:32:06
【问题描述】:
当我编辑 T4 时,每次切换到另一个文件时都会执行脚本。快速简单的脚本是可以的,但有些脚本需要很长时间才能执行。有没有办法禁用这种行为?我希望脚本仅在我保存 T4 文件或从菜单中手动选择“运行自定义工具”时运行。
【问题讨论】:
标签: c# visual-studio code-generation t4 customtool
当我编辑 T4 时,每次切换到另一个文件时都会执行脚本。快速简单的脚本是可以的,但有些脚本需要很长时间才能执行。有没有办法禁用这种行为?我希望脚本仅在我保存 T4 文件或从菜单中手动选择“运行自定义工具”时运行。
【问题讨论】:
标签: c# visual-studio code-generation t4 customtool
T4 模板在文件保存时执行。如果您将 VS 设置为在您从可以解释该行为的文件中跳出时自动保存。检查您的 VS 配置以确定 VS 是否在您离开时保存文件。
【讨论】:
T4 与 C#/VB 项目系统中的自定义工具机制 (IVsSingleFileGenerator) 相连,这使其能够在保存时运行、运行自定义工具菜单以及在选项卡上切换行为 - 所有这些都以实现一个简单的接口。
不幸的是,这意味着 T4 也基本上无法控制这些行为,这是自定义工具的标准。
另一种方法可能是使用 VS 建模和可视化 SDK 中的 T4 MsBuild 支持在构建时执行 T4,然后禁用自定义工具。我会询问构建 msbuild 支持的同事是否使用自定义工具来识别模板集并发回线程。
【讨论】:
我遇到了完全相同的问题。我按照本文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
#>
【讨论】:
在编译指令之后尝试,添加一个返回退出方法
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension="Repository.cs"#><#
return string.Empty; //<-- add this line!!!
...
【讨论】:
我正在做的(可能是一个不好的方法)是在 tt 文件的开头写一个异常行,如:
<# throw new Exception(); #>
因为我抛出了一个异常,所以进程停止了,当我完成所有工作时,我只需要删除这一行。 :)
【讨论】:
我发现在开发 T4 模板时使用 T4 文件顶部的以下代码 sn-p 很有用:
<# //throw exception to halt execution during development
throw new Exception();
#>
如果保存T4时出现错误,则会显示,否则显示消息:
错误运行转换:System.Exception:抛出了“System.Exception”类型的异常。
然后在您准备好实际生成 T4 输出时将异常注释掉。
【讨论】: