有谁知道如何阻止T4(tt)模板重新生成每个文件?有没有办法标记某些文件?

时间:2010-11-06 20:03:48

标签: t4

因此,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();
#>

1 个答案:

答案 0 :(得分:2)

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

  1. MyClass.generated.cs
  2. MyClass.cs
  3. 永远不会重新创建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的属性,这是关键。