什么是' .tt'延期?

时间:2016-01-05 21:17:02

标签: t4 file-extension

我使用Knockout和一堆something.js.tt HTML文件处理了大量something-else.tt JavaScript文件。

基础架构主要是带有Perl服务API的C后端,我们使用这些.tt文件来显示HTML和.js.tt以提供Knockout.js代码。什么是.tt

3 个答案:

答案 0 :(得分:7)

TT文件是由Microsoft开发的Visual Studio文本模板。

答案 1 :(得分:4)

Text Template Transformation Toolkit,很快写成T4,使用.tt文件扩展名作为其源文件。它是Visual Studio附带的Microsoft基于模板的文本生成框架。

有关详细信息,请参阅the docs

答案 2 :(得分:0)

如果您查看文件内部,您可能会注意到很多逻辑注入内容。这是因为这种文件是用来生成其他文件的。

如@Recev Yildiz 分享的 MS 页面所述:

<块引用>

在 Visual Studio 中,T4 文本模板是 text blockscontrol logic 的混合体,可以generate a text file

<块引用>

控制逻辑在 Visual C# 或 Visual Basic 中编写为程序代码片段。在 Visual Studio 2015 Update 2 及更高版本中,您可以在 T4 模板指令中使用 C# 6.0 版功能。

<块引用>

生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。

<块引用>

T4 文本模板有两种:运行时和设计时。

以下是我从 ASP.NET Web 应用程序 (.NET Framework) 项目(MVC 设计)中的实体框架文件中获取的代码示例:

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
 output extension=".cs"#><#

const string inputFile = @"DBModel.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var loader = new EdmMetadataLoader(textTransform.Host, textTransform.Errors);
var itemCollection = loader.CreateEdmItemCollection(inputFile);
var modelNamespace = loader.GetModelNamespace(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);

var container = itemCollection.OfType<EntityContainer>().FirstOrDefault();
if (container == null)
{
    return string.Empty;
}
#>
//------------------------------------------------------------------------------
// <auto-generated>
// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#>
//
// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#>
// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#>
// </auto-generated>
//------------------------------------------------------------------------------

<#

var codeNamespace = code.VsNamespaceSuggestion();
if (!String.IsNullOrEmpty(codeNamespace))
{
#>
namespace <#=code.EscapeNamespace(codeNamespace)#>
{
<#
    PushIndent("    ");
}

#>
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
<#
}
#>

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}

foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
{
    // Note: the DbSet members are defined below such that the getter and
    // setter always have the same accessibility as the DbSet definition
    if (Accessibility.ForReadOnlyProperty(entitySet) != "public")
    {
#>
        <#=codeStringGenerator.DbSetInitializer(entitySet)#>
<#
    }
}
#>
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

<#
    foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
    {
#>
    <#=codeStringGenerator.DbSet(entitySet)#>
<#
    }

    foreach (var edmFunction in container.FunctionImports)
    {
        WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: false);
    }
#>
}

该文件比您在此处看到的要大得多。正如您所看到的,它似乎是一个非常繁忙的代码。

这是放置文件的上下文:

enter image description here

您可以在此处查看整个文件和项目上下文:https://github.com/carloswm85/2021-WestLakeClinic-TestProject/tree/master/WestLakeClinicApp/Models