17

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

4

6 回答 6

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

#>
于 2011-10-19T13:04:20.647 回答
7

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

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

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

于 2010-10-28T06:00:12.050 回答
4

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

<# throw new Exception(); #>

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

于 2016-06-05T02:54:55.950 回答
2

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

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

...

于 2014-07-15T18:56:37.303 回答
1

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

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

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

运行转换时出错:System.Exception:引发了“System.Exception”类型的异常。

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

于 2020-08-20T17:28:52.463 回答
0

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

于 2010-10-27T15:37:03.747 回答