我在我的项目中有一些T4模板。每当我对tt文件进行更改并保存时,它会自动更新生成的文件。这是一个循环遍历数据库中所有表格并生成大约100个以上文件的模板。因此,每次保存我的模板时,Visual Studio都会挂起几秒钟,这很烦人。有没有办法禁用“自动刷新”功能,我可以通过上下文菜单手动运行模板。
谢谢!
我在我的项目中有一些T4模板。每当我对tt文件进行更改并保存时,它会自动更新生成的文件。这是一个循环遍历数据库中所有表格并生成大约100个以上文件的模板。因此,每次保存我的模板时,Visual Studio都会挂起几秒钟,这很烦人。有没有办法禁用“自动刷新”功能,我可以通过上下文菜单手动运行模板。
谢谢!
在编辑文件时,您可以在文件的属性下删除“Custom Tool”中的TextTemplatingFileGenerator,并在完成后将其放回。
<#+
#
#>
<#+
//#
#>
由于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");