181 votes

Faites en sorte que Visual Studio exécute un modèle T4 à chaque construction.

Comment faire pour qu'un modèle T4 génère sa sortie à chaque construction ? En l'état actuel des choses, il ne se régénère que lorsque j'apporte une modification au modèle.

J'ai trouvé d'autres questions similaires à celle-ci :

Transformation T4 et ordre de construction dans Visual Studio (sans réponse)

Comment faire pour que les fichiers t4 soient construits dans Visual Studio ? (les réponses ne sont pas assez détaillées [tout en étant très compliquées] et n'ont même pas de sens).

Il doit y avoir un moyen plus simple de le faire !

0 votes

Je serais personnellement très intéressé par une réponse à cette question, mais quel est votre scénario particulier ? Normalement, la sortie du modèle devrait être une fonction de l'entrée uniquement, donc la génération sur changement est bien.

7 votes

Mon modèle utilise la réflexion pour examiner les autres assemblages, qui peuvent avoir été modifiés depuis la dernière version.

0 votes

Que pensez-vous de cette idée : stackoverflow.com/questions/1649649/

74voto

Cheburek Points 1265

Je suis d'accord avec GarethJ - dans VS2010 il est beaucoup plus facile de régénérer les modèles de tt à chaque construction. Le blog d'Oleg Sych décrit comment le faire. En bref :

  1. Installer Visual Studio SDK
  2. Installer Visual Studio 2010 Modélisation et de visualisation SDK
  3. Ouvrez le fichier du projet dans un éditeur de texte et ajouter à la fin du fichier mais avant </Project>

C'est ça. Ouvrez votre projet. A chaque build tous les templates *.tt seront retraités

<!-- This line could already present in file. If it is so just skip it  -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- process *.tt templates on each build  -->
<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

2 votes

Voici un lien vers l'article du blog d'Oleg Sych : olegsych.com/2010/04/comprendre-t4-msbuild-integration

4 votes

C'est une très bonne solution. Cependant, existe-t-il un moyen de la faire fonctionner sans avoir à installer les SDK ? J'ai essayé de la faire fonctionner en copiant les fichiers .targets et les assemblages associés, mais sans succès.

0 votes

J'utilise également Chirpy (voir ci-dessous dans le post de @Mark) et sur le site officiel rien n'est écrit sur la dépendance du SDK. Vous devriez donc l'essayer. J'espère que cela vous aidera

72voto

Seth Reno Points 2221

J'ai utilisé la réponse de JoelFan pour arriver à ceci. Je l'aime mieux parce que vous n'avez pas à vous souvenir de modifier l'événement de pré-construction chaque fois que vous ajoutez un nouveau fichier .tt au projet.

  • ajoutez TextTransform.exe à votre liste de diffusion. %PATH%
  • créé un fichier batch nommé transform_all.bat (voir ci-dessous)
  • créer un événement de pré-construction " transform_all ..\.. "

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the working dir (default to current dir)
set wdir=%cd%
if not (%1)==() set wdir=%1

:: set the file extension (default to vb)
set extension=vb
if not (%2)==() set extension=%2

echo executing transform_all from %wdir%
:: create a list of all the T4 templates in the working dir
dir %wdir%\*.tt /b /s > t4list.txt

echo the following T4 templates will be transformed:
type t4list.txt

:: transform all the templates
for /f %%d in (t4list.txt) do (
set file_name=%%d
set file_name=!file_name:~0,-3!.%extension%
echo:  \--^> !file_name!    
TextTransform.exe -out !file_name! %%d
)

echo transformation complete

29 votes

Bonne solution. Je préférais mettre le chemin complet vers TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" ) dans le fichier batch, plutôt que de l'ajouter à %PATH%.

21 votes

Une meilleure variable serait %COMMONPROGRAMFILES(x86)% au lieu de %COMMONPROGRAMFILES% car elle fonctionnerait également sur un système 64 bits.

3 votes

Le chemin complet sera donc %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe . Mettez-le entre guillemets.

20voto

JoelFan Points 11368

J'ai utilisé la réponse de MarkGr et développé cette solution. Tout d'abord, créez un fichier batch appelé RunTemplate.bat dans un outils au-dessus du dossier de la solution principale. Le fichier batch a juste la ligne :

"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %1.cs -P %2 -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %1.tt

Ce fichier batch prend 2 paramètres... %1 est le chemin d'accès au fichier .tt sans l'extension .tt. %2 est le chemin d'accès à toute DLL mentionnée par Montage dans le modèle.

Ensuite, allez dans les propriétés du projet contenant le modèle T4. Allez dans Événements de construction et ajoutez ce qui suit Ligne de commande de l'événement de pré-construction :

$(SolutionDir)..\..\tools\RunTemplate.bat $(ProjectDir)MyTemplate $(OutDir)

remplacement de MonModèle avec le nom de fichier de votre fichier .tt (c'est-à-dire MyTemplate.tt) sans l'extension .tt. Cela aura pour résultat de développer le modèle pour produire MyTemplate.cs avant de construire le projet. Ensuite, la construction réelle compilera MyTemplate.cs.

0 votes

Bien que j'aie toujours le problème : stackoverflow.com/questions/1669893/

1 votes

N'oubliez pas les guillemets autour de $(SolutionDir) . \..\tools\RunTemplate.bat

14voto

Mark Melville Points 384

J'ai récemment découvert cet excellent plugin VS, Chirpy .

Non seulement il génère votre T4 sur une construction, mais il permet une approche basée sur le T4 pour la minification de javascript, CSS, et vous permet même d'utiliser la syntaxe LESS pour votre CSS !

9voto

MarkGr Points 472

Vérifiez C:\Program Fichiers (x86) \Common Fichiers \Microsoft Partagé \TextTemplating il y a un exe de transformation de ligne de commande là-dedans. Vous pouvez aussi écrire une tâche MSBuild avec un hôte personnalisé et faire la transformation vous-même.

1 votes

Oh, bien que vous puissiez faire des choses comme "devenv /Command TextTransformation.TransformAllTemplates /Command File.Exit MySolution.sln" en 2010, cela a tendance à se casser sur les serveurs de construction de temps en temps. Votre meilleure chance est d'écrire une tâche MSBuild avec un hôte personnalisé.

0 votes

Pour les constructions de bureau, il suffit de créer une macro qui fait un TransformAllTemplates, puis une construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X