如何禁用将#line指令写入T4生成输出文件

本文关键字:T4 输出 文件 何禁用 #line 指令 | 更新日期: 2023-09-27 18:12:24

我在生成T4代码时遇到了一个小问题。

我已经将T4模板分解成单独的文件,并将它们放在不同的目录中,我这样做是为了让我的部分代码生成可以在多个项目中重用,例如模型生成、存储库生成和服务生成都包括一个核心EntityGeneration。tt文件。

不幸的是,当texttemplate解析我的嵌套包含时,它在生成的.cs文件中构建了一个很长的#line预处理器指令,将所有的相对路径组合到最低级别的包含文件。

不幸的是,由于这个路径是由相对路径构建的,它最终会变得不必要的长,实际上它超过了最大路径长度(Windows 7)。

如果您感兴趣的话,下面是生成代码中的错误行:

#line 3 "C:'VS2010'AlbatrossTravelGroup'ASC'AlbatrossTravelGroup.ASC.BusinessRules'Services'Contracts'..'..'..'..'AlbatrossTravelGroup.BusinessRules'Services'Contracts'..'..'..'AlbatrossTravelGroup.Models'Repositories'Contracts'..'..'../AlbatrossTravelGroup.Common/CodeGeneration.tt"

我的问题是,我怎么能禁用这些指令被写入生成的代码文件?如果做不到这一点,如何在不改变文件结构的情况下避免这个问题?

如何禁用将#line指令写入T4生成输出文件

Visual Studio 2012增加了linePragmas="false"模板指令:

<#@ template language="C#" linePragmas="false" #>

http://msdn.microsoft.com/en-us/library/gg586945 (v = vs.110) . aspx

仍然不确定如何在VS2010中做到这一点,我在工作中坚持。

我不确定这会解决你的问题。我对T4没有太多的经验。也就是说,我正在用它在我的项目中构建一些文件,我还没有遇到你遇到的问题。

在我的情况下,我有一堆单独的.tt文件,在我的项目中呈现单独的文件。

我这样做的方式如下:我有一个SaveOutput方法(偷从某处stackoverflow,我相信):

void SaveOutput(string outputFileName)
{
    if (!string.IsNullOrEmpty(outputFileName))
    {
        string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
        string outputFilePath = Path.Combine(templateDirectory, outputFileName);
        string output = this.GenerationEnvironment.ToString();
        File.WriteAllText(outputFilePath, output); 
    }
    this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}

所以在我的主。tt文件中,我有<#@ includes…#>表示我的各种.tt文件,表示各个文件。例如:<#@ include file="DataObjectInterface. "tt"#>

<#+
    public string GenerateInterfaceDataObject(sqlTable table)
    {
        string ifaceName = "I" + table.ObjectName;
        if (table.GenerateInterfaceObjectAsBase)
        {
            ifaceName += "Base";
        }
#>
using System;
namespace <#= InterfaceNamespace #>
{
    public interface <#= ifaceName #>
    {
<#+
        foreach(sqlColumn col in table.Columns)
        {
#>
        <#= GetColumnCSharpDataType(col) #> <#= col.FieldName #> { get; }
<#+
        }
#>
    }
}
<#+
        return RootPath + @"'AutoGenerated'" + ifaceName + ".cs";
    }
#>

然后,在我的主。tt类中,我简单地像这样调用:

string filePath = GenerateInterfaceDataObject(table);
SaveOutput(filePath);

不确定这种分解模板的方法是否适合你的需要,但它对我的工作有效,我还没有遇到任何问题。

我应该澄清一下,我的主。tt文件实际上并不从它自己生成任何东西。它本身并不是一个模板。它只是加载每个模板,并从其他模板生成文件。