2011-04-07 14 views
22

Tengo una plantilla T4 que puede generar contenido optimizado o contenido estándar basado en un indicador. Actualmente estoy cambiando manualmente la bandera según mis necesidades.Determine la configuración de la solución (depuración/liberación) al ejecutar una plantilla T4

Lo que me gustaría hacer es establecer la bandera según la configuración de la solución en Visual Studio. Si se configura para compilar en el modo de depuración, generaría contenido estándar. Si se configura para compilar en modo Release, optimizaría el contenido en su lugar. He encontrado otra pregunta T4 que parece prometedor: T4 Text Template - Is it possible to get compilation symbols from host?

Sin embargo, en mi caso me gustaría hacer algo como lo siguiente:

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

Desde que puedo usar $ (SolutionDir) en una directiva de ensamblado:

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

yo creo que el/d: $ (ConfigurationName) podría llegar a donde tenía que ir, y entonces yo podría hacer lo siguiente para configurar mi bandera:

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

Por desgracia, esto no parece funcionar. También intenté usar:

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

También inútilmente. ¿Algunas ideas?

Respuesta

22

Apenas lo pregunto pero encuentro un fragmento en la parte inferior de this MSDN article que me lleva a donde tengo que estar. La respuesta aquí es usar la interfaz IServiceProvider para obtener el Visual Studio DTE. Aquí está el código que está conseguir que se haga (disculpas de antemano por la "depuración" 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"); 

ACTUALIZACIÓN

Este código de verificación para ver si la configuración actual del proyecto activo tiene optimizaciones torneadas en. Todavía tiene un nombre de propiedad codificado, pero es mucho menos probable que cambie. Además, el uso de la bandera optimización del proyecto tiene mucho sentido para mi escenario (se trata de decidir si debería encender optimizaciones en mi propio código):

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

¿Hay una página para la clase DTE en los documentos de MSDN? Lo he estado buscando y tengo dificultades para encontrar uno. – rstackhouse

+0

No importa. Creo que acabo de encontrarlo: http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

SDTE? ¿Es eso un error tipográfico? –

9

Para las personas tratando de conseguir este trabajo en tiempo de diseño (archivo guardado) así como at build-time (F5/F6), se necesitan dos métodos.

Emil describe el método del tiempo de diseño. Para la acumulación de tiempo, primero tiene que especificar un parámetro T4 en el archivo de proyecto:

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

entonces usted tiene que hacer referencia a ella en la parte superior de su .tt:

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

y luego buscar cualquiera de ellas que pasa a ser proporcionado:

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; 
} 

es necesario incluir la lógica para ambos si usted quiere que su plantilla funcione en ambos escenarios. El método de tiempo de diseño no funciona en tiempo de compilación (el host DTE no está disponible para proporcionar la solución) y el método de tiempo de compilación no funciona en tiempo de diseño (MSBuild no está presente para proporcionar el parámetro).

Cuestiones relacionadas