Determinar la configuración de la solución (depuración/liberación) al ejecutar una plantilla T4


Tengo una plantilla T4 que puede generar contenido optimizado o contenido estándar basado en un indicador. Actualmente estoy cambiando manualmente la bandera en función de mis necesidades.

Lo que me encantaría hacer es establecer el indicador basado en la Configuración de la Solución en Visual Studio. Si se establece para construir en modo de depuración, me gustaría salida de contenido estándar. Si se establece para construir en el modo de lanzamiento, optimizaría el contenido en su lugar. Encontré otra pregunta T4 que parece prometedora: T4 Text Template-Is it ¿es posible obtener símbolos de compilación del host?

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

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

Ya que puedo usar $(SolutionDir) en una directiva ensambladora:

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

Pensaría que el /d :ame (ConfigurationName) me llevaría a donde necesitaba ir, y luego podría hacer lo siguiente para establecer mi bandera:

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

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

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

También en vano. Alguna idea?

 23
t4
Author: Community, 2011-04-08

2 answers

Apenas pregunto, encuentro un fragmento en la parte inferior de este artículo de MSDN que me lleva a donde necesito estar. La respuesta aquí es usar la interfaz IServiceProvider para obtener el Visual Studio DTE . Aquí está el código que lo está haciendo (disculpas por adelantado por la "depuración" codificada):

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 comprobará si la configuración actual del proyecto activo tiene optimizaciones activadas. Todavía tiene una propiedad codificada nombre, pero uno que es mucho menos probable que cambie. Además, usar el indicador de optimización del proyecto tiene mucho sentido para mi escenario (tratando de decidir si debo activar las 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;
    }
}
 23
Author: Emil Lerch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 15:11:42

Para las personas que intentan obtener este trabajo en tiempo de diseño (archivo guardado), así como en tiempo de compilación (F5/F6), son necesarios dos métodos.

Emil describe el método design-time. Para el tiempo de compilación, primero debe especificar un parámetro T4 en su archivo de proyecto:

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

Entonces tienes que referenciarlo en la parte superior de tu .tt:

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

Y luego buscar cualquiera de ellos sucede que se proporciona:

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 se quiere su plantilla para trabajar en ambos escenarios. El tiempo de diseño método no funciona al momento de construir (DTE Host no está alrededor para proporcionar la Solución), y el momento de construir método no funciona en tiempo de diseño (MSBuild no está alrededor para proporcionar el parámetro).

 9
Author: Calvin Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-26 20:53:30