如何在Visual Studio(2012)中禁用T4模板自动运行?

12

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

谢谢!


是的,我很惊讶“feature”在Visual Studio中。该功能甚至还出现在Visual Studio 2013中,这使得在Visual Studio内开发T4模板几乎不可能。 - Kelly Elton
3个回答

12

在编辑文件时,您可以在文件的属性下删除“Custom Tool”中的TextTemplatingFileGenerator,并在完成后将其放回。


谢谢分享。这个解决方法肯定可行。不知道是否有更好的选项。 - Calvin

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

#

#>

禁用故障:
<#+

//#

#>

你也可以在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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接