2012-05-07 18 views
17

Sto suddividendo il codice T4 in file separati per modularità e riutilizzo, ma sto scoprendo che ogni file mi costa una riga vuota in uscita. Ad esempio:Modelli T4 - evitare le righe vuote dai file inclusi

Se Include.tt elenca altri 3 file * .tt, ottengo 3 righe vuote prima dello spazio dei nomi. Mentre aggiungo il codice e lo divido in file * .tt separati, questo spazio vuoto continua a crescere. In effetti, ho riunito tutti i file di inclusione in un singolo Include.tt, sperando che questo mi costerà solo una riga vuota. Non è stato così. Ricevo ancora una riga vuota per ogni file elencato in Includes.tt. C'è un modo per evitarlo?

Edit: partendo dal presupposto che non sto facendo solo un errore muto (e mi auguro sinceramente che io sono), il problema non è così banale come può sembrare a prima vista:

a) riutilizzo e modularità tramite i file T4 inclusi è vecchio come T4 stesso ed è stato menzionato nell'ultimo articolo di MSDN Magazine: "Gestire la complessità nelle soluzioni di generazione di codice T4".

b) Se il codice viene generato automaticamente, non significa che sia corretto perché è formattato in modo errato o non è leggibile.

c) Con la soluzione corrente, nel mio caso, per ogni file .cs generato da il lettore dovrebbe scorrere per una pagina vuota finché non inizia a vedere del testo generato. Tutto perché ho diviso la mia generazione di codice tra più file .tt inclusi. Questo non sembra giusto.

risposta

14

Oh bene, la soluzione si è rivelata banale, se un po 'inaspettato: basta mettere la comprendono direttive prossimo a vicenda, invece di uno sotto un'altra:

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

Ciao Tony - questo è un po 'un retaggio delle nostre prime versioni. Ora siamo un po 'dispiaciuti di "aggiustarlo" in quanto ciò romperebbe la retrocompatibilità per le persone che hanno utilizzato la soluzione alternativa.Ci siamo divertiti con l'idea di un flag di attivazione, qualcosa del tipo "smarterParsing = true", ma non mi dilungo troppo a testare due codepath di parsing a questo punto: – GarethJ

+0

Lo stesso trucco funziona anche con Single Include - assicurati che non ci siano caratteri tra il tag di chiusura dell'inserimento e l'istruzione successiva (sia letterale o ViktorZ

+0

Il vero motivo è che ogni modello generato (è un codice cs) ha un \ r \ n in 'pubblico stringa virtuale TransformText() { this.Write ("\ r \ n"); ', quindi la risposta sta funzionando semplicemente perché la nuova riga è stata aggiunta premendo return dopo che ogni modello incluso è stato omesso. – Sebastian

12

Per aggiungere a Tony di Risposta: È possibile evitare le lunghissime linee aggiungendo le interruzioni di riga all'interno delle parentesi T4 in questo modo:

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

ho avuto un problema più fondamentale in cui ogni <#@ linea di intestazione prima <?xml causato una propria linea vuota nell'output, che ha causato l'errore:

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. 

Dopo aver scavato per un po 'ho scoperto il file .tt aveva Unix EOL.

Quando sono passato a Windows EOL, la trasformazione ha rimosso le righe vuote.

+0

Ho ottenuto questo oggi :) Grazie per r scrivendo la risposta! –

+1

Ho incollato il codice con Unix EOL. Windows EOL non genera righe vuote dai file inclusi. Grazie! – maxbeaudoin

9

Questo funziona anche per me in VS 2013:

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

e così

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

Il <##> è solo un blocco di controllo vuota. <# /* any code here */ #> funziona altrettanto bene.

+1

Questa dovrebbe essere la risposta accettata, grazie. –

+2

Questo non ha funzionato per me su VS 2015. – Nathan

2

Nel mio caso le righe vuote risultano da uno spazio finale dopo il tag di chiusura delle istruzioni import.

+0

Incontrato il problema della linea vuota nel mese di luglio 2017 e gli spazi finali sulle righe di istruzioni di importazione era il motivo. –