2012-11-27 89 views
9

我的项目中有一些T4模板。每当我做出更改并保存tt文件时,它都会自动更新生成的文件。这是一个循环数据库中所有表的模板,并生成大约100多个文件。因此,每当我保存我的模板时,visual studio会挂起几秒钟,这很烦人。有没有办法禁用“自动刷新”功能,我可以通过上下文菜单手动运行模板。如何在Visual Studio(2012)中禁用T4模板自动运行?

谢谢!

+0

是的,我很惊讶, “功能” 在Visual Studio。地狱,我很惊讶它仍然在visual studio 2013中。它使得在visual studio中开发t4模板几乎是不可能的。 –

回答

11

在编辑文件时,您可以在文件属性的“自定义工具”下删除TextTemplatingFileGenerator,然后在完成后将其放回。

+0

感谢您的分享。这项工作肯定会奏效。想知道是否有更好的选择。 – Calvin

1

我有一个类似的问题。我通过创建一个ttinclude文件(实际上这已经是一个包含我的模板的实用函数的标准包含文件)并将其包含在我所有的T4模板中,从而快速找到了解决方法。然后我只是在include文件中创建了一个编译器错误。因此,当生成器试图运行时,它只会在编译时失败。然后,当我准备好实际生成时,我摆脱了有问题的代码,然后生成。

例如引起故障:

<#+ 

# 

#> 

要禁用失败:

<#+ 

//# 

#> 

您还可以,如果你只是想禁用你的工作的一个用这一招在T4模板本身。

希望未来的VS版本将允许您简单地禁用自动转换。

0

由于TT总是执行(仍然),所以当TT执行时,我发现了一种不同的方式来控制输出。

/********SET THIS TO REGENERATE THE FILE (OR NOT) ********/ 

var _RegenerateFile = true; 

/********COS VS ALWAYS REGENERATES ON SAVE ***************/ 

// Also, T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process" 

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName; 
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug"); 

Directory.SetCurrentDirectory(_CurrentFolder); 
Debug.WriteLine($"Using working folder {_CurrentFolder}"); 

if (_RegenerateFile == false) 
{ 
    Debug.WriteLine($"Not Regenerating File"); 
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName); 
    return fileContent; 
} 

Debug.WriteLine($"Regenerating File"); //put the rest of your usual template 

另一种方法(我对最终结算)是基于读取设置上是为T4提供数据的类之一的属性条件编译符号。除非添加REGEN_CODE_FILES条件编译符号,否则这会带来跳过所有准备工作(以及IDE滞后)的好处。 (我想这也可以做成一个新的解决方案的配置了。是的,这不工作,并删除下面类变化的需要)

类我在同一组件调用的例子..

public class MetadataProvider 
{ 
    public bool RegenCodeFile { get; set; } 

    public MetadataProvider() 
    { 

#if REGEN_CODE_FILES 
     RegenCodeFile = true; //try to get this to set the property 
#endif 
     if (RegenCodeFile == false) 
     { 
      return; 
     } 
     //code that does some degree of preparation and c... 
    } 
} 

在TT文件...

var _MetaProvider = new MetadataProvider(); 
var _RegenerateFile = _MetaProvider.RegenCodeFile; 

// T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process" 

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName; 
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug"); 

Directory.SetCurrentDirectory(_CurrentFolder); 
Debug.WriteLine($"Using working folder {_CurrentFolder}"); 

if (_RegenerateFile == false) 
{ 
    Debug.WriteLine($"Not Regenerating File"); 
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName); 
    return fileContent; 
} 

Debug.WriteLine($"Regenerating File");