Подтвердить что ты не робот

Как отключить директивы #line, записываемые в выходной файл поколения T4

Я столкнулся с небольшой проблемой с генерацией кода T4.

Я сломал свои T4-шаблоны в отдельные файлы и поместил их в разные каталоги, я сделал это, поэтому части моего генерации кода могут быть повторно использованы в нескольких проектах, например. генерация модели, генерация репозитория и создание службы включают в себя основной файл EntityGeneration.tt.

К сожалению, когда TextTemplating разрешает мои вложенные включения, он создает длинную предпроцессорную директиву #line в своем сгенерированном файле .cs, объединяющем все относительные пути к файлу с минимальным уровнем.

К сожалению, поскольку этот путь построен с относительными путями, он становится ненужным долго, так как на самом деле он превышает максимальную длину пути (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"

Мой вопрос в том, как я могу отключить эти директивы, записываемые в сгенерированный файл кода? В противном случае, как я могу избежать этой проблемы без изменения моей файловой структуры?

4b9b3361

Ответ 1

Visual Studio 2012 добавляет директиву linePragmas="false":

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

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

Не уверен, как это сделать в VS2010, на котором я застрял на работе.

Ответ 2

Я не уверен, что это исправит вашу проблему. У меня нет большого опыта работы с 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 фактически не генерирует ничего из себя. Это не сам шаблон. Он просто загружает каждый из шаблонов и генерирует файлы из других шаблонов.