【问题标题】:Does anyone know how to stop T4 (tt) templates from regerating every single file? Is there a way to flag certain files?有谁知道如何阻止 T4 (tt) 模板重新生成每个文件?有没有办法标记某些文件?
【发布时间】:2011-05-06 02:55:10
【问题描述】:

因此,无论何时保存,tt 模板都会重新生成每个文件。现在,太好了,它会生成文件。但是,我正在制作部分类来扩展其他类,但我只需要为我生成不存在的文件。那些存在的,我想保留。到目前为止,我在全球范围内没有找到一种可靠的解决方案......

在我下面的代码中,查找现有文件的异常无关紧要,因为模板将首先删除所有文件。然后它会重新生成。

我可以覆盖像“onsave”这样的方法吗?

// BEGIN CODE TO GENERATE EXTENSIONS
<#
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{ 
 string fileName = entity.Name + ".Extension.cs";
 string filePath = this.Host.TemplateFile.Substring(0,this.Host.TemplateFile.LastIndexOf(@"\")); 
 filePath = filePath + @"\Extensions\" + fileName;
 if((File.Exists(filePath) && PreserveExistingExtensions == false) || !File.Exists(filePath))
 {
  fileManager.StartNewFile(fileName);
  BeginNamespace(namespaceName, code);
  bool entityHasNullableFKs = entity.NavigationProperties.Any(np => np.GetDependentProperties().Any(p=>ef.IsNullable(p)));
#>
<#=Accessibility.ForType(entity)#>   
<#=code.SpaceAfter(code.AbstractOption(entity))#>partial class 
<#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
{
}
<#
EndNamespace(namespaceName);
 }
}
fileManager.Process();
#>

【问题讨论】:

  • 为什么不用生成的代码检查文件内容呢?据我所知,你正在控制这个过程。

标签: t4


【解决方案1】:

我做了一些类似的事情(部分类),我有一个总是生成的,但只有在它不存在时才会生成自定义的。第二个被创建为自定义的起始类。我会像这样输出两个文件:

  1. MyClass.generated.cs
  2. MyClass.cs

MyClass.cs 永远不会被重新创建,除非它不存在。 MyClass.generated.cs 将始终被重新创建。

我使用T4toolbox 来执行此操作,Oleg Sych 实际上使这变得非常简单。

您可以查看我构建的一些示例 T4 模板 here。具体看一下this one,这是生成部分类的一个很好的例子,每次都需要创建一个,并且只有在不存在时才创建一个。

主要看的是代码中的这一行:

    var requestBaseMessageCustom = new MessageTemplate(rootNamespace, serviceName + "Request");
    requestBaseMessageCustom.Output.File = "Messages/" + serviceName + "Request.cs";
    requestBaseMessageCustom.Output.PreserveExistingFile = true;
    requestBaseMessageCustom.Render();

注意名为PreserveExistingFile 的属性,这就是关键。

【讨论】:

  • 您继承自:您的 MessageTemplate 中的模板 - 此引用的程序集是什么??
猜你喜欢
  • 2019-06-16
  • 2012-08-07
  • 2011-05-10
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多