2012-05-07 15 views
17

Estoy dividiendo el código T4 en archivos separados para modularidad y reutilización, pero estoy descubriendo que cada archivo me cuesta una línea vacía en la salida. Por ejemplo:Plantillas T4: evite las líneas vacías de los archivos incluidos

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

Si Includes.tt enumera otros 3 archivos * .tt, obtengo 3 líneas en blanco antes del espacio de nombres. Como estoy agregando código y dividiéndolo en archivos * .tt separados, este espacio vacío sigue creciendo. De hecho, empaqué todos los archivos incluidos en un solo Includes.tt, con la esperanza de que esto me cueste solo una línea vacía. No fue así. Todavía tengo una línea vacía por cada archivo enumerado en Includes.tt. ¿Hay alguna forma de evitar esto?

Editar: suponiendo que no estoy haciendo sólo un error tonto (y espero sinceramente que soy), el problema no es tan trivial como puede aparecer en la primera vista:

a) Reutilización y modularidad a través de los archivos T4 incluidos es tan antiguo como T4 y se mencionó en el último artículo de MSDN Magazine: "Gestión de la complejidad en 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 cada y cada archivo .cs generado, el lector debería desplazarse por una página vacía hasta que empiece a ver el texto generado. Todo porque he dividido la generación de mi código entre múltiples archivos .tt incluidos. Eso simplemente no parece correcto.

Respuesta

14

Bueno, la solución resultó ser trivial, si algo inesperado: sólo hay que poner la incluyen directivas próxima el uno al otro, en lugar de uno continuación 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.... 
+2

Hola Tony: esto es un poco un legado de nuestras primeras versiones. Ahora estamos un poco reacios a 'arreglarlo', ya que eso rompería la compatibilidad con versiones anteriores para las personas que han usado la solución alternativa.Hemos jugado con la idea de una bandera de opt-in, algo así como 'smarterParsing = true', pero "no estoy demasiado interesado a tener que probar dos codepaths análisis sintáctico en este punto – GarethJ

+0

El mismo truco funciona incluso con una sola Incluir. - sólo asegúrese de que no hay caracteres entre etiqueta de cierre de la inclusión y la siguiente instrucción (ya sea literal o ViktorZ

+0

la verdadera razón es que cada plantilla generada (que es el código CS) tiene un \ r \ n en 'pública TransformText virtual de cadena() { this.Write ("\ r \ n"); ', por lo que su respuesta se acaba funcionando porque se omite la nueva línea añadida pulsando retorno después de cada plantilla incluida – Sebastian

12

Para añadir a Tony Respuesta: Usted puede evitar las líneas muy largas mediante la adición de los saltos de línea dentro de los corchetes T4, así:

<#@ 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 
8

tuve un problema más fundamental que cada <#@ línea de cabecera antes <?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 durante un tiempo descubrí el archivo .tt tenía Unix EOL.

Cuando cambié a Windows EOL, la transformación eliminó las líneas en blanco.

+0

Tienes esta de hoy :) Gracias fo r escribiendo la respuesta! –

+1

He pegado el código con Unix EOL. Windows EOL no genera líneas vacías a partir de los archivos incluidos. ¡Gracias! – maxbeaudoin

9

Esto también funciona para mí en VS 2013:

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

y así

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

El <##> es sólo un bloque de control de vacío. <# /* any code here */ #> funciona igual de bien.

+1

Esta debería ser la respuesta aceptada, gracias. –

+2

Esto no funcionó para mí en VS 2015. – Nathan

2

En mi caso las líneas en blanco resultaron de un espacio posterior después de la etiqueta de cierre de import declaraciones.

+0

encontrado con el problema de la línea en blanco en julio de 2017 y los espacios finales en las líneas de la cuenta de importación fue la razón. –

Cuestiones relacionadas