Plantillas T4: evita las líneas vacías de los archivos incluidos
(5)
Estoy dividiendo el código T4 en archivos separados para modularización y reutilización, pero estoy descubriendo que cada archivo me cuesta una línea vacía en la salida. Por ejemplo:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Includes.tt" #>
namespace <#= NameSpace #>
{
Si Include.tt lista otros 3 archivos * .tt, obtengo 3 líneas en blanco antes del espacio de nombres. Al agregar código y dividirlo en archivos * .tt separados, este espacio vacío sigue creciendo. De hecho, empaqueté todos los archivos de inclusión en un solo Include.tt, con la esperanza de que esto me cueste una sola línea vacía. No lo hizo Todavía obtengo una línea vacía por cada archivo enumerado en Incluye.tt. ¿Hay alguna forma de evitar esto?
Edit: asumiendo que no estoy cometiendo un simple error (y sinceramente espero que lo esté), el problema no es tan trivial como puede parecer a primera vista:
a) La reutilización y modularidad a través de los archivos T4 incluidos es tan antigua como la propia T4 y se mencionó en el último artículo de MSDN Magazine: "Administración de la complejidad en las soluciones de generación de códigos T4".
b) Si el código se genera automáticamente, no significa que esté bien que esté mal formateado o que sea poco legible.
c) Con la solución actual, en mi caso, para todos y cada uno de los archivos .cs generados, el lector tendrá que desplazarse por una página vacía hasta que empiece a ver un texto generado. Todo porque he dividido mi generación de código entre varios archivos .tt incluidos. Eso simplemente no parece correcto.
En mi caso, las líneas en blanco resultaron de un espacio al final después de la etiqueta de cierre de las declaraciones de import
.
Esto también me funciona en VS 2013:
<#@ include file="Other.tt" #><##>
y entonces
<#@ include file="One.tt" #><##>
<#@ include file="Two.tt" #><##>
...
El <##>
es solo un bloque de control vacío. <# /* any code here */ #>
funciona igual de bien.
Oh, bueno, la solución resultó ser trivial, aunque algo inesperada: simplemente coloque las directivas de inclusión una al lado de la otra, en lugar de una debajo de la otra:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Usings.tt" #> <#@ Include file="PropertyTypeEnum.tt" #> <#@ Include....
Para agregar a la respuesta de Tony: Puedes evitar las líneas muy largas agregando los saltos de línea dentro de los soportes T4 de la siguiente manera:
<#@ 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
Tuve un problema más fundamental donde cada línea de encabezado <#@
antes de <?xml
causó su propia línea en blanco en la salida, lo que provocó el error:
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.
Después de cavar por un tiempo descubrí que el archivo .tt tenía Unix EOL.
Cuando cambié a Windows EOL, la transformación eliminó las líneas en blanco.