2010-10-27 9 views
10

Cuando edito T4, el script se ejecuta cada vez que cambio a otro archivo. Está bien para scripts rápidos y simples, pero algunos scripts tardan mucho tiempo en ejecutarse. ¿Hay alguna forma de desactivar este comportamiento? Quiero que la secuencia de comandos se ejecute solo cuando guardo el archivo T4 o elijo "Ejecutar herramienta personalizada" en el menú.¿Cómo detener la ejecución de T4 cada vez que cambio a otra pestaña?

Respuesta

5

T4 está conectado al mecanismo de herramienta personalizado (IVsSingleFileGenerator) en los sistemas de proyectos C#/VB, lo que le permite ejecutar, ejecutar menú de herramientas personalizadas y también el comportamiento de cambio de pestañas, todo por el precio de implementar una interfaz simple.

Desafortunadamente, esto significa que T4 tampoco tiene control sobre esos comportamientos, que son el estándar para las herramientas personalizadas.

Una alternativa puede ser utilizar el soporte T4 MsBuild en VS Modelling and Visualization SDK para hacer T4 en tiempo de compilación y luego deshabilitar la herramienta personalizada. Preguntaré a mi colega que construyó el soporte de msbuild si usa la herramienta personalizada para identificar el conjunto de plantillas o no y vuelve a publicar en el hilo.

+0

Uso T4 Toolbox que genera múltiples archivos y modifica la solución. No estoy seguro de que funcione en MsBuild. Ejecutar T4 solo en tiempo de compilación no es una opción para mí de todos modos, quiero ver los resultados de inmediato, cuando guardo el archivo T4. Pero puede proporcionar información sobre el uso de MsBuild para otras personas que encuentren esta pregunta. Puede ser útil para ellos. – Athari

+1

Veo - no hemos intentado integrar los dos - Oleg bien pudo haberlo hecho. Simplemente confirmé que la herramienta personalizada ya no es necesaria para msbuild, pero en su lugar necesitaría cambiar el tipo de elemento en su archivo csproj/vbproj de None/Compile a T4Transform o T4Preprocess. Los archivos de salida ya no serían parte de su proyecto. Hay metadatos que pueden redirigirlos a la carpeta obj intermedia o similar. – GarethJ

-1

Las plantillas T4 se ejecutan cuando se guarda el archivo. Si tiene la configuración VS para guardar automáticamente cuando se aleja del archivo que podría explicar el comportamiento. Revise su configuración de VS para determinar si VS está guardando el archivo cuando elimina la pestaña.

+4

La pregunta es, ¿dónde está esta configuración? – Athari

+3

-1 Esta es información incorrecta. Cuando cambia de pestaña, la plantilla T4 se ejecuta automáticamente, aunque la pestaña todavía tenga "*" en el nombre, lo que indica que el archivo no se guardó. – mellamokb

8

Tuve exactamente el mismo problema. Seguí los pasos de este artículo http://msdn.microsoft.com/en-us/library/ee789839.aspx sobre cómo dividir las plantillas en otro proyecto y compartir los archivos de salida.

Detalla cómo apagar el TextTemplatingFileGenerator herramienta acoplada a la plantilla haciendo clic derecho en la plantilla y la limpieza de la propiedadCustomTool. Esto detiene el código de generación de la plantilla cuando se guarda ... ¡pero TODAVÍA FUNCIONA cuando se cambian las pestañas!

Creo que la única forma de evitar esto sería mover todo el código de plantilla en un archivo nuevo con un sufijo diferente (como ttinclude o t4 o algo) y luego incluir este archivo en su archivo de plantilla T4 real utilizando el incluir directiva. De esta forma, nunca tendrá que abrir ese archivo para editar la plantilla, de modo que no se ejecutará por accidente.

Así que en un archivo llamado MyTemplate.tt:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<#@ include file="Include\MyTemplateCodeBehind.t4" #> 
<#@ output extension=".vb"#> 
<# ' Nothing to see here! #> 

Mientras que en el otro archivo llamado MyTemplateCodeBehind.t4:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<# 
    For Each something In somecollection 
#> 
    <#= something.PrintMyCode() #> 
<# 
    Next 

#> 
1

Trate justo después de las directivas de compilación, añadir un retorno a salir método

<#@ template language="C#" debug="false" hostspecific="true"#> 
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
output extension="Repository.cs"#><# 
return string.Empty;  //<-- add this line!!! 

...

2

Lo que estoy haciendo (probablemente un mal método) está escribiendo en el principio del archivo tt una línea de excepción como:

<# throw new Exception(); #> 

Porque lanzar una excepción de la parada del proceso y cuando termine todo el trabajo que solo tiene que eliminar esta línea. :)

Cuestiones relacionadas