我的项目中有一些 T4 模板。每当我进行更改并保存 tt 文件时,它都会自动更新生成的文件。这是一个循环数据库中所有表并生成大约 100 多个文件的模板。所以每次我保存模板时,Visual Studio 都会挂起几秒钟,这很烦人。有没有办法禁用“自动刷新”功能,我可以通过上下文菜单手动运行模板。
谢谢!
我的项目中有一些 T4 模板。每当我进行更改并保存 tt 文件时,它都会自动更新生成的文件。这是一个循环数据库中所有表并生成大约 100 多个文件的模板。所以每次我保存模板时,Visual Studio 都会挂起几秒钟,这很烦人。有没有办法禁用“自动刷新”功能,我可以通过上下文菜单手动运行模板。
谢谢!
您可以在编辑文件时删除文件属性中“自定义工具”下的 TextTemplatingFileGenerator,然后在完成后将其放回原处。
我有一个类似的问题。我通过创建一个 ttinclude 文件(实际上这已经是一个标准的包含文件,其中包含我的模板的实用程序函数)并将其包含在我的所有 T4 模板中,找到了一个快速的解决方法。然后我只是在包含文件中创建了一个编译器错误。因此,当生成器尝试运行时,它只会在编译时失败。然后,当我准备好实际生成时,我会删除有问题的代码,然后生成。
例如导致失败:
<#+
#
#>
要禁用故障:
<#+
//#
#>
如果您只想禁用正在处理的模板,也可以在 T4 模板本身中使用此技巧。
希望未来的 VS 版本将允许您简单地禁用自动转换。
由于 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");