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");
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. –