2011-04-07 9 views
22

Ho un modello T4 in grado di produrre contenuto ottimizzato o contenuto standard basato su un flag. Attualmente sto modificando manualmente la bandiera in base alle mie esigenze.Determinare la configurazione della soluzione (debug/release) quando si esegue un modello T4

Quello che mi piacerebbe fare è impostare il flag in base alla configurazione della soluzione in Visual Studio. Se impostato per costruire in modalità Debug, vorrei produrre un contenuto standard. Se impostato per creare in modalità di rilascio, vorrei invece ottimizzare il contenuto. Ho trovato un'altra domanda T4 che sembra essere molto promettente: T4 Text Template - Is it possible to get compilation symbols from host?

Tuttavia, nel mio caso io vorrei fare qualcosa di simile al seguente:

<#@ template language="C#" hostspecific="True" 
    compilerOptions="/d:$(ConfigurationName)" #> 

Dal momento posso usare $ (SolutionDir) in una direttiva di montaggio:

<#@ assembly name="$(SolutionDir)\myreference.dll" #> 

penserei l'/ d: $ (ConfigurationName) otterrebbe me dove ho bisogno di andare, e poi ho potuto effettuare le seguenti operazioni per impostare la mia bandiera:

<# 
#if Debug 
optimize = false; 
#else 
optimize = true; 
#endif 
#> 

Ahimè, questo non sembra funzionare. Ho anche provato a usare:

Host.ResolveParameterValue("-", "-", "ConfigurationName"); 

Anche senza risultato. Qualche idea?

risposta

22

Non appena lo chiedo, ma trovo uno snippet nella parte inferiore di this MSDN article che mi porta dove devo essere. La risposta qui è utilizzare l'interfaccia IServiceProvider per ottenere lo Visual Studio DTE. Ecco il codice che è sempre fatto (scuse in anticipo per il "debug" hard-coded):

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
optimize = (configName != "Debug"); 

UPDATE

Questo codice verifica per vedere se la configurazione attuale del progetto attivo ha ottimizzazioni tornite sopra. Ha ancora un nome di proprietà hard-coded, ma uno che è molto meno probabile che cambi. Inoltre, utilizzando flag di ottimizzazione del progetto fa un sacco di senso per il mio scenario (cercando di decidere se devo accendere le ottimizzazioni nel mio codice):

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as DTE; 
config = dte.Solution 
      .FindProjectItem(Host.TemplateFile) 
      .ContainingProject 
      .ConfigurationManager 
      .ActiveConfiguration; 
foreach(Property prop in config.Properties){ 
    if (prop.Name == "Optimize"){ 
     optimize = (bool)prop.Value; 
     break; 
    } 
} 
+0

Esiste una pagina per la classe DTE nei documenti MSDN? L'ho cercato e ho avuto difficoltà a trovarne uno. – rstackhouse

+0

Nevermind. Penso di averlo appena trovato: http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

SDTE? È un errore di battitura? –

9

Per le persone cercando di ottenere questo lavoro in fase di progettazione (file save) e at build-time (F5/F6), sono necessari due metodi.

Emil descrive il metodo della progettazione. Per l'accumulo di tempo, è necessario prima di specificare un parametro di T4 nel file di progetto:

<ItemGroup> 
    <T4ParameterValues Include="BuildConfiguration"> 
    <Value>$(Configuration)</Value> 
    <Visible>false</Visible>  
    </T4ParameterValues> 
</ItemGroup> 

poi si deve fare riferimento a esso nella parte superiore del vostro .tt:

<#@ parameter type="System.String" name="BuildConfiguration" #> 

E quindi cercare a seconda di quale di essi accade da fornire:

string configurationName = Host.ResolveParameterValue("-", "-", "BuildConfiguration"); 
if (string.IsNullOrWhiteSpace(configurationName)) 
{ 
    var serviceProvider = (IServiceProvider)Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
    configurationName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 
} 

E 'necessario includere la logica per entrambi, se si desidera che il modello di lavorare in entrambi gli scenari. Il metodo design-time non funziona in fase di build (l'host DTE non è in grado di fornire la soluzione) e il metodo build-time non funziona in fase di progettazione (MSBuild non è in giro per fornire il parametro).

Problemi correlati