Шаблоны T4 - избегайте пустых строк из включенных файлов - программирование
Подтвердить что ты не робот

Шаблоны T4 - избегайте пустых строк из включенных файлов

Я разбиваю код T4 в отдельных файлах для модульности и повторного использования, но я выясняю, что каждый файл стоит мне пустую строку вывода. Например:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Includes.tt" #>
namespace <#= NameSpace #>
{

If Includes.tt перечисляет 3 других файла *.tt, я получаю 3 пустые строки перед пространством имен. Поскольку я добавляю код и разделяю его в отдельные файлы *.tt, это пустое пространство продолжает расти. Фактически, я упаковал все включенные файлы в один Includes.tt, надеясь, что это обойдется мне в одну пустую строку. Это не так. Я все еще получаю одну пустую строку для каждого файла, указанного в Includes.tt. Есть ли способ избежать этого?

Править: считая, что я не делаю просто тупой ошибки (и я искренне надеюсь, что я нахожусь), проблема не такая тривиальная, как может показаться с первого взгляда:

a) Повторное использование и модульность с помощью включенных T4 файлов так же стара, как и сам T4, и упоминалось в последней статье журнала MSDN: "Управление сложностью в решениях формирования кода T4".

b) Если код сгенерирован автоматически, это не значит, что он хорошо отформатирован или плохо читается.

c) В текущем решении, в моем случае, для каждого генерируемого файла .cs, читателю придется прокручивать одну пустую страницу, пока она не увидит какой-то сгенерированный текст. Все, потому что я разделил генерацию кода между несколькими включенными файлами .tt. Это просто не кажется правильным.

4b9b3361

Ответ 1

Хорошо, решение оказалось тривиальным, если несколько неожиданным: просто поместите директивы include next друг другу, а не один ниже другой:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Usings.tt" #> <#@ Include file="PropertyTypeEnum.tt" #> <#@ Include.... 

Ответ 2

Чтобы добавить к ответу Тони: вы можете избежать очень длинных строк, добавив строки в скобки T4 так:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Usings.tt" 
#><#@ Include file="PropertyTypeEnum.tt" 
#><#@ Include....
#><#@ Include....
#><#@ Include....
#><#@ some other stuff 

Ответ 3

Это также работает для меня в VS 2013:

<#@ include file="Other.tt" #><##>

и поэтому

<#@ include file="One.tt" #><##>
<#@ include file="Two.tt" #><##>
...

<##> - пустой блок управления. <# /* any code here */ #> работает так же хорошо.

Ответ 4

У меня была более фундаментальная проблема, когда каждая строка заголовка <#@ до <?xml вызывала свою пустую строку на выходе, что вызвало ошибку:

error : Unexpected XML declaration.
        The XML declaration must be the first node in the document,
        and no white space characters are allowed to appear before it.
        Line 7, position 3.

После копания некоторое время я обнаружил, что файл .tt имел Unix EOL.

Когда я переключился на Windows EOL, преобразование удалило пустые строки.

Ответ 5

В моем случае пустые строки были получены из конечного пробела после закрывающего тега import.