¿Cómo obtengo una plantilla T4 para generar su salida en cada compilación? Tal como está ahora, solo lo regenera cuando hago un cambio en la plantilla.
He encontrado otras preguntas similares a esta:
Transformación T4 y orden de compilación en Visual Studio (sin respuesta)
¿Cómo obtener archivos t4 para construir en Visual Studio? (las respuestas no son lo suficientemente detalladas [aunque siguen siendo bastante complicadas] y ni siquiera tienen sentido)
¡Tiene que haber una manera más simple de hacer esto!
visual-studio
tfs
msbuild
t4
JoelFan
fuente
fuente
Respuestas:
Usé la respuesta de JoelFan para aparecer con esto. Me gusta más porque no tiene que acordarse de modificar el evento previo a la compilación cada vez que agrega un nuevo archivo .tt al proyecto.
%PATH%
transform_all ..\..
"transform_all.bat
fuente
"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"
) en el archivo por lotes, en lugar de agregarlo a% PATH%%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe
. Envuélvelo entre comillas dobles.TextTransform.exe
mierda. Ya puede hacer clic con el botón derecho en "Ejecutar herramienta personalizada" en Visual Studio, por lo que ya tiene la ruta de la herramienta. ¿Por qué tengo que pasar por el trabajo de proporcionarlo nuevamente cuando construyo desde un contexto de Visual Studio?Estoy de acuerdo con GarethJ: en VS2010 es mucho más fácil regenerar plantillas tt en cada compilación. El blog de Oleg Sych describe cómo hacerlo. En breve:
</Project>
Eso es. Abre tu proyecto. En cada compilación, todas las plantillas * .tt serán reprocesadas
fuente
msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Hay un gran paquete NuGet que hace exactamente esto:
Los detalles sobre el paquete se pueden encontrar aquí
fuente
content
acciones de compilación<#@ template language="C#" #>
Usé la respuesta de MarkGr y desarrollé esta solución. Primero, cree un archivo por lotes llamado RunTemplate.bat en una carpeta de herramientas separada sobre la carpeta de la solución principal. El archivo por lotes solo tiene la línea:
Este archivo por lotes toma 2 parámetros ... % 1 es la ruta al archivo .tt sin la extensión .tt. % 2 es la ruta a las DLL a las que hacen referencia las directivas de ensamblado en la plantilla.
A continuación, vaya a las Propiedades del proyecto del proyecto que contiene la plantilla T4. Vaya a Eventos de compilación y agregue la siguiente línea de comando de eventos de precompilación :
reemplazando MyTemplate con el nombre de archivo de su archivo .tt (es decir, MyTemplate.tt) sin la extensión .tt. Esto tendrá el resultado de expandir la plantilla para producir MyTemplate.cs antes de construir el proyecto. Entonces la compilación real compilará MyTemplate.cs
fuente
Recientemente encontré este gran complemento VS, Chirpy .
No solo genera tu T4 en una compilación, sino que permite un enfoque basado en T4 para la minificación de javascript, CSS, ¡e incluso te permite usar MENOS sintaxis para tu CSS!
fuente
Probablemente la forma más simple es instalar una extensión de Visual Studio llamada AutoT4 .
Ejecuta todas las plantillas T4 en la compilación de forma automática.
fuente
La construcción previa se puede reducir a una sola línea:
Esto transforma todos los
.tt
archivos del proyecto y los enumera en la salida de compilación.Si no desea el resultado de la compilación, debe evitar algunos "comportamientos interesantes" :
Por supuesto, puede extraerlo en un archivo por lotes al que pasará la ruta del directorio del proyecto si lo desea.
Nota : la ruta puede requerir algunos ajustes. La ruta anterior es donde VS 2008 lo instaló en mi máquina; pero es posible que el número de versión entre
TextTemplating
yTextTransform.exe
sea diferente.fuente
System.Exception: T4MVC can only execute through the Visual Studio host
Echa un vistazo a C: \ Archivos de programa (x86) \ Archivos comunes \ Microsoft Shared \ TextTemplating hay un exe de transformación de línea de comando allí. Alternativamente, escriba una tarea de MSBuild con un host personalizado y realice la transformación usted mismo.
fuente
Ampliando las respuestas de Seth Reno y JoelFan , se me ocurrió esto. Con esta solución, no necesita recordar modificar el evento previo a la compilación cada vez que agrega un nuevo archivo .tt al proyecto.
Procedimiento de implementacion
transform_all.bat "$(ProjectDir)" $(ProjectExt)
para cada proyecto con un .tt que desee compilartransform_all.bat
Notas
La transformación de texto supone que el código en la plantilla T4 es el mismo idioma que su tipo de proyecto. Si este caso no se aplica a usted, deberá reemplazar el
$(ProjectExt)
argumento con la extensión de los archivos que desea que genere el código..TT
los archivos deben estar en el directorio del proyecto; de lo contrario, no se generarán. Puede crear archivos TT fuera del directorio del proyecto especificando una ruta diferente como primer argumento ( es decir, reemplazar"$(ProjectDir)"
con la ruta que contiene los archivos TT).Recuerde también configurar la ruta correcta al
transform_all.bat
archivo por lotes.Por ejemplo, lo coloqué en mi directorio de soluciones para que el evento previo a la compilación fuera el siguiente
"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
fuente
t4list.txt
archivo en PasteBin para que intente ver si su error proviene de allí?for /f "delims=" %%d in (t4list.txt) do (
y las restricciones corporativas le impiden publicar sut4list.txt
archivo, me temo que no hay mucho que pueda hacer para ayudarlo. Realmente quería ayudar a resolver esto, pero parece que será imposible ya que no tengo datos para continuar. Buena suerte para solucionar el problema y recuerde publicar su solución cuando tenga éxito.(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
? Desafortunadamente, obtengo una excepción de referencia nula , cuando ejecuto tt desde fuera de Visual Studio.Si usa Visual Studio 2010, puede usar el SDK de modelado y visualización de Visual Studio: http://code.msdn.microsoft.com/vsvmsdk
Contiene tareas de msbuild para ejecutar plantillas T4 en tiempo de compilación.
Eche un vistazo al blog de Oleg para obtener más explicaciones: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration
fuente
Hola, mi script también puede analizar la extensión de salida
Simplemente cree
transform_all.bat $(SolutionDir)
un evento previo a la compilación, y todos los archivos * .tt en su solución se transformarán automáticamente.fuente
Dynamo.AutoTT hará lo que necesites. Puede configurarlo para ver archivos a través de una expresión regular o generar en la compilación. También le permite especificar qué plantillas T4 desea que active.
Puede descargarlo desde aquí: https://github.com/MartinF/Dynamo.AutoTT
Simplemente compílelo, copie los archivos dll y AddIn en
C: \ Usuarios \ Documentos \ Visual Studio 2012 \ Complementos \
y te vas.
Si desea que funcione en VS2012, deberá modificar el archivo Dynamo.AutoTT.AddIn y establecer la Versión en 11.0 dentro del archivo AddIn;
fuente
Gracias a GitHub.com/Mono/T4 , en este momento puede hacerlo para las compilaciones de .NET Core y Visual Studio agregando esto a su
.csproj
archivo:Si transforma sus plantillas a diferentes lenguajes de programación, debe agregar algo como
<Compile Remove="**\*.vb" />
y<Compile Include="**\*.vb" />
para compilar estos archivos, incluso si aún no ha generado archivos.Remove
yInclude
truco solo necesario para la primera generación, o puede acortar el XML de esta manera:y simplemente ejecuta build dos veces (por primera vez). Si ya ha generado archivos comprometidos con el repositorio, no habrá problemas en las reconstrucciones con ambos ejemplos.
En Visual Studio, es posible que desee ver algo como esto:
en lugar de esto:
Entonces agregue algo como esto a su archivo de proyecto:
Ejemplo completo aquí: GitHub.com/Konard/T4GenericsExample (incluye la generación de múltiples archivos a partir de una sola plantilla).
fuente
Aquí está mi solución, similar a la respuesta aceptada. Tuvimos un problema con nuestro control de fuente. Los archivos .cs de destino son de solo lectura y el T4 estaba fallando. Aquí está el código, que ejecuta T4 en la carpeta temporal, compara los archivos de destino y los copia solo en caso de que se produzca el mismo cambio. No soluciona el problema con los archivos read.only, pero al menos no ocurre con mucha frecuencia:
Transform.bat
Puede intentar agregar su comando de salida en una línea (:: Puede intentar ....)
En su proyecto establezca esto como una acción previa a la construcción:
fuente
Solo necesita agregar este comando al evento previo a la compilación del proyecto:
La comprobación de configuración = depuración, se asegura de que no regenere el código en el modo de lanzamiento, cuando realiza la compilación en el servidor de compilación TFS, por ejemplo.
fuente
En Visual Studio 2013, haga clic con el botón derecho en la plantilla T4 y establezca la transformación en la propiedad de compilación en verdadero.
fuente
Así es como lo vi. Enlace . Básicamente construyendo sobre un gran blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ no puede publicar más de 2 enlaces :() Se me ocurrió este archivo .targets para usar con archivos de estudio visual.
Es útil cuando está utilizando otros dll-s dentro de su .tt y desea que el resultado cambie a medida que cambian los dll-s.
Cómo funciona:
Elimine las referencias de ensamblado de .tt
Dentro del archivo de proyecto, use este código para configurar la transformación en la compilación:
Primera parte Localiza TextTransform.exe
$(IncludeForTransform)
será igual ac:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll
porque esa es la forma de agregar referencias para TextTransform en la línea de comando<_TextTransform Include="$(ProjectDir)**\*.tt" />
esto crea una lista de todos los archivos tt dentro del proyecto y subdirectorios<Exec Command="...
produce una línea para cada uno de los archivos .tt encontrados que se parece a"C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"
Lo único que queda por hacer es agregar las rutas a los dlls dentro de:
Aquí se
<InProject>False</InProject>
ocultan estos elementos de la Vista de soluciónEntonces, ahora debería poder generar su código en la compilación y en el cambio de dll-s.
Puede eliminar la herramienta personalizada (de las propiedades dentro de Visual Studio) para que el VS no intente transformarse y falle miserablemente cada vez. Porque eliminamos las referencias de ensamblaje en el paso 2
fuente
T4Executer hace esto para VS2019. Puede especificar plantillas para ignorar en la compilación, y hay una opción de ejecución después de la compilación.
fuente
Simplemente instale NuGet Package: Clarius.TransformOnBuild
Luego, cada vez que haga clic en Reconstruir proyecto (o Solución), se ejecutarán sus archivos .tt
fuente
En Visual Studio 2017 (probablemente también en las próximas versiones), debe agregar esto en el evento Pre-build:
ps Cambia la ruta a tu plantilla si no se encuentra en el directorio raíz del proyecto.
fuente
Algún tipo construyó un paquete nuget para esto.
Nota al margen: recibo errores de compilación tanto de TextTemplate.exe como de ese paquete (porque ese paquete llama a TextTemplate.exe) pero no de Visual Studio. Entonces aparentemente el comportamiento no es el mismo; aviso.
EDITAR: Esto terminó siendo mi problema.
fuente
Aquí hay un evento previo a la compilación que utiliza solo herramientas de Microsoft y rutas estándar. Se probó en vs2019 / netcore3.1.
Reemplace "AppDbContext.tt" con su ruta de archivo relativa al proyecto:
Microsoft también tiene una guía para hacer que las macros como "$ (SolutionDirectory)" estén disponibles en la plantilla utilizando T4ParameterValues en su archivo de proyecto.
fuente