2012-11-27 15 views
9

Ho alcuni modelli T4 nel mio progetto. Ogni volta che apporto delle modifiche e salvo il file tt, aggiorna automaticamente i file generati. Questo è un modello che scorre tutte le tabelle in un database e genera circa 100 file. Quindi lo studio visivo si blocca per qualche secondo ogni volta che salvi il mio modello e questo è fastidioso. C'è un modo per disabilitare la funzione "auto-refresh" e posso eseguire manualmente il modello attraverso il menu contestuale.come disabilitare il template T4 auto-run in visual studio (2012)?

Grazie!

+0

Sì sono sorpreso che "caratteristica" è in visual Studio. Diavolo, sono sorpreso che sia ancora in Visual Studio 2013. Rende praticamente impossibile lo sviluppo di template T4 all'interno di Visual Studio. –

risposta

11

È possibile eliminare TextTemplatingFileGenerator in "Strumento personalizzato" nelle Proprietà del file mentre lo si modifica, quindi reinserirlo al termine.

+0

Grazie per aver condiviso. Questo lavoro sicuramente funzionerà. Mi chiedo se c'è un'opzione migliore. – Calvin

1

Ho avuto un problema simile. Ho trovato un rapido lavoro in giro creando un file ttcllude (in realtà questo era già un file include standard contenente funzioni di utilità per i miei modelli) e includendolo in tutti i miei modelli T4. Quindi ho semplicemente creato un errore del compilatore nel file include. Quindi, quando il generatore ha tentato di eseguirlo, semplicemente fallirebbe la compilazione. Quindi, quando sono pronto per generare effettivamente, mi libererò del codice offendente e poi genererò.

ad es. Per causare un fallimento:

<#+ 

# 

#> 

Per disattivare il fallimento:

<#+ 

//# 

#> 

È anche possibile utilizzare questo trucco nel template T4 in sé, se si desidera solo per disattivare quello che si sta lavorando.

Speriamo che le future versioni di VS consentiranno di disabilitare semplicemente l'auto-trasformazione.

0

Poiché TT viene sempre eseguito (ancora), ho trovato un modo diverso per controllare l'uscita quando viene eseguito il TT.

/********SET THIS TO REGENERATE THE FILE (OR NOT) ********/ 

var _RegenerateFile = true; 

/********COS VS ALWAYS REGENERATES ON SAVE ***************/ 

// Also, T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process" 

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName; 
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug"); 

Directory.SetCurrentDirectory(_CurrentFolder); 
Debug.WriteLine($"Using working folder {_CurrentFolder}"); 

if (_RegenerateFile == false) 
{ 
    Debug.WriteLine($"Not Regenerating File"); 
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName); 
    return fileContent; 
} 

Debug.WriteLine($"Regenerating File"); //put the rest of your usual template 

Un altro modo (quello che alla fine ho optato per) si basa sulla lettura di un simbolo di compilazione condizionale che imposta una proprietà su una delle classi che fornisce i dati per la T4. Ciò offre il vantaggio di saltare tutta la preparazione (e il ritardo IDE) a meno che non si aggiunga il simbolo di compilazione condizionale REGEN_CODE_FILES. (Immagino che questo possa anche essere fatto in una nuova configurazione di soluzione. sì, funziona e rimuove la necessità della modifica della classe sotto)

Un esempio della classe che sto chiamando nello stesso assembly ..

public class MetadataProvider 
{ 
    public bool RegenCodeFile { get; set; } 

    public MetadataProvider() 
    { 

#if REGEN_CODE_FILES 
     RegenCodeFile = true; //try to get this to set the property 
#endif 
     if (RegenCodeFile == false) 
     { 
      return; 
     } 
     //code that does some degree of preparation and c... 
    } 
} 

nel file TT ...

var _MetaProvider = new MetadataProvider(); 
var _RegenerateFile = _MetaProvider.RegenCodeFile; 

// T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process" 

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName; 
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug"); 

Directory.SetCurrentDirectory(_CurrentFolder); 
Debug.WriteLine($"Using working folder {_CurrentFolder}"); 

if (_RegenerateFile == false) 
{ 
    Debug.WriteLine($"Not Regenerating File"); 
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName); 
    return fileContent; 
} 

Debug.WriteLine($"Regenerating File"); 
Problemi correlati