Question

Comment puis-je obtenir un modèle T4 pour générer sa sortie sur chaque génération? Dans l’état actuel, il ne le régénère que lorsque je modifie le modèle.

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

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

Comment obtenir des fichiers t4 pour créer des éléments visuels studio? (les réponses ne sont pas assez détaillées [tout en restant très compliquées] et n'ont même pas de sens total)

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

Était-ce utile?

La solution

J’ai utilisé la réponse de JoelFan pour revenir avec cela. J'aime mieux cela parce que vous n'avez pas à vous souvenir de modifier l'événement de pré-génération chaque fois que vous ajoutez un nouveau fichier .tt au projet.

  • ajoutez TextTransform.exe à votre %PATH%
  • a créé un fichier de commandes 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

Autres conseils

Je suis d’accord avec GarethJ - dans VS2010, il est beaucoup plus facile de régénérer des modèles de tt sur chaque build. Le blog d'Oleg Sych explique comment procéder. En bref:

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

C'est ça. Ouvrez votre projet. Sur chaque construction, tous les modèles * .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" />

Il existe un excellent package NuGet qui ne fait que ceci:

PM> Install-Package Clarius.TransformOnBuild

Les détails sur le paquet peuvent être trouvé ici

J'ai utilisé la réponse de MarkGr et développé cette solution. Commencez par créer un fichier de commandes appelé RunTemplate.bat dans un dossier outils séparé, au-dessus du dossier de la solution principale. Le fichier de commandes n'a que la ligne suivante:

"%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 de commandes 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 à toutes les DLL référencées par les directives Assemblage dans le modèle.

Ensuite, allez dans les Propriétés du projet du projet contenant le modèle T4. Accédez à Créer des événements et ajoutez la ligne de commande de l'événement de pré-génération :

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

remplacer MyTemplate par le nom de fichier de votre fichier .tt (c'est-à-dire MyTemplate.tt) sans l'extension .tt. Cela aura pour résultat d'élargir le modèle afin de produire MyTemplate.cs avant de générer le projet. Ensuite, la construction actuelle compilera MyTemplate.cs

Vous avez récemment découvert ce formidable plug-in VS, Chirpy .

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

La méthode la plus simple consiste probablement à installer une extension Visual Studio appelée AutoT4 .

Il exécute tous les modèles T4 lors de la création automatique.

La pré-construction peut être réduite à une seule ligne:

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

Ceci transforme tous les .tt fichiers du projet et les répertorie dans la sortie de la construction.

Si vous ne souhaitez pas que la sortie soit générée, vous devez contourner un & "comportement intéressant" & "; :

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

Bien sûr, vous pouvez extraire cela dans un fichier de commandes auquel vous transmettez le chemin du répertoire du projet si vous le souhaitez.

NB Le chemin d'accès peut nécessiter quelques ajustements. Le chemin ci-dessus est celui où VS 2008 l’a installé sur ma machine; mais vous constaterez peut-être que le numéro de version compris entre TextTemplating et TextTransform.exe est différent.

Commander C: \ Program Files (x86) \ Fichiers communs \ Microsoft Shared \ TextTemplating il y a un fichier exe de transformation en ligne de commande. Vous pouvez également écrire une tâche MSBuild avec un hôte personnalisé et effectuer la transformation vous-même.

Développement de Seth Reno et de Réponses de JoelFan , je suis venu avec cela. Avec cette solution, vous n'avez pas besoin de vous rappeler de modifier l'événement de pré-génération chaque fois que vous ajoutez un nouveau fichier .tt au projet.

Procédure de mise en œuvre

  • Créez un fichier de commandes nommé transform_all.bat (voir ci-dessous)
  • Créez un événement de pré-génération transform_all.bat "$(ProjectDir)" $(ProjectExt) pour chaque projet avec le fichier .tt que vous souhaitez générer

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the correct path to the the app
if not defined ProgramFiles(x86). (
  echo 32-bit OS detected
  set ttPath=%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\
) else (
  echo 64-bit OS detected
  set ttPath=%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\
)

:: set the working dir (default to current dir)
if not (%1)==() pushd %~dp1

:: set the file extension (default to vb)
set ext=%2
if /i %ext:~1%==vbproj (
  set ext=vb
) else if /i %ext:~1%==csproj (
  set ext=cs
) else if /i [%ext%]==[] (
  set ext=vb
)

:: create a list of all the T4 templates in the working dir
echo Running TextTransform from %cd%
dir *.tt /b /s | findstr /vi obj > t4list.txt

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

:: delete T4 list and return to previous directory
del t4list.txt
popd

echo T4 transformation complete


NOTES

  1. La transformation de texte suppose que le code du modèle T4 est le même langage que votre type de projet. Si ce cas ne vous concerne pas, vous devrez remplacer l'argument $(ProjectExt) par l'extension des fichiers à générer par le code.

  2. Les fichiers
  3. .TT doivent se trouver dans le répertoire du projet sinon ils ne seront pas générés. Vous pouvez créer des fichiers TT en dehors du répertoire du projet en spécifiant un chemin différent comme premier argument ( i.e. remplacer "$(ProjectDir)" par le chemin contenant les fichiers TT.)

  4. N'oubliez pas de définir également le chemin d'accès correct au transform_all.bat fichier de traitement par lots.
    Par exemple, je l'ai placé dans mon répertoire de solution afin que l'événement de pré-génération soit comme suit "$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)

Si vous utilisez Visual Studio 2010, vous pouvez utiliser le Kit de développement logiciel de visualisation et de modélisation Visual Studio: http://code.msdn.microsoft.com/vsvmsdk

Ceci contient les tâches msbuild pour l'exécution des modèles T4 au moment de la construction.

Consultez le blog d'Oleg pour plus d'explications: http://www.olegsych.com/2010/04/understanding-t4 -msbuild-integration

Hé, mon script peut également analyser l'extension de sortie

for /r %1 %%f in (*.tt) do (
 for /f "tokens=3,4 delims==, " %%a in (%%f) do (
  if %%~a==extension "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %%~pnf.%%~b -P %%~pf -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %%f
 )
)
echo Exit Code = %ERRORLEVEL%

Il suffit de créer transform_all.bat $(SolutionDir) un événement de pré-génération et tous les fichiers * .tt de votre solution seront automatiquement transformés.

Dynamo.AutoTT fera ce dont vous avez besoin. Vous pouvez le configurer pour regarder des fichiers via une regex ou générer lors de la construction. Il vous permet également de spécifier les modèles T4 que vous souhaitez déclencher.

Vous pouvez le télécharger ici: https://github.com/MartinF/Dynamo.AutoTT

Il suffit de le construire, de copier les fichiers dll et AddIn dans

C: \ Utilisateurs \ Documents \ Visual Studio 2012 \ Addins \

et c'est parti.

Si vous souhaitez le lancer dans VS2012, vous devez modifier le fichier Dynamo.AutoTT.AddIn et définir la version sur 11.0 dans le fichier AddIn.

Voici ma solution - semblable à la réponse acceptée. Nous avons eu un problème avec notre contrôle de source. Les fichiers .cs cibles sont en lecture seule et le T4 échouait. Voici le code qui exécute T4 dans un dossier temporaire, compare les fichiers cible et ne le copie que si les mêmes modifications étaient apportées. Cela ne résout pas le problème des fichiers read.only, mais au moins cela ne se produit pas très souvent:

Transform.bat

ECHO Transforming T4 templates
SET CurrentDirBackup=%CD%
CD %1
ECHO %1
FOR /r %%f IN (*.tt) DO call :Transform %%f
CD %CurrentDirBackup%
ECHO T4 templates transformed
goto End

:Transform
set ttFile=%1
set csFile=%1

ECHO Transforming %ttFile%:
SET csFile=%ttFile:~0,-2%cs
For %%A in ("%ttFile%") do Set tempTT=%TEMP%\%%~nxA
For %%A in ("%csFile%") do Set tempCS=%TEMP%\%%~nxA

copy "%ttFile%" "%tempTT%
"%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%tempTT%"

fc %tempCS% %csFile% > nul
if errorlevel 1 (
 :: You can try to insert you check-out command here.
 "%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%ttFile%"
) ELSE (
 ECHO  no change in %csFile%
)

del %tempTT%
del %tempCS%
goto :eof

:End

Vous pouvez essayer d'ajouter votre commande d'extraction sur une ligne (:: Vous pouvez essayer ....)

Dans votre projet, définissez cette action comme une action de pré-construction:

Path-To-Transform.bat "$(ProjectDir)"

Il vous suffit d'ajouter cette commande à l'événement de pré-génération du projet:

if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe  /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets"  $(ProjectPath) /t:TransformAll 

La vérification de configuration = debug, assure que vous ne régénérez pas le code en mode édition, lorsque vous construisez par exemple sur le serveur de compilation TFS.

Dans Visual Studio 2013, cliquez avec le bouton droit de la souris sur le modèle T4 et définissez la propriété de transformation sur génération sur true.

Voici comment je l’ai viré. Lien . Construire essentiellement sur un blog de qualité (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ ne peut pas publier plus que 2 links :() J'ai créé ce fichier .targets pour utilisation. avec les fichiers Visual Studio Proj.

C'est utile lorsque vous utilisez d'autres dll-s à l'intérieur de votre .tt et que vous voulez que le résultat change à mesure que les dll-s changent.

Comment ça marche:

  1. Créez le tt, ajoutez le nom d'assembly = " $ (SolutionDir) path \ to \ other \ project \ output \ foo.dll et configurez la transformation et le résultat de la manière attendue
  2. Supprimer les références d'assemblage de .tt

  3. Dans le fichier proj, utilisez ce code pour configurer la transformation lors de la construction:

    <PropertyGroup>
      <!-- Initial default value -->
      <_TransformExe>$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <!-- If explicit VS version, override default -->
      <_TransformExe Condition="'$(VisualStudioVersion)' != ''">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</_TransformExe>
      <!-- Cascading probing if file not found -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe</_TransformExe>
      <!-- Future proof 'til VS2013+2 -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\15.0\TextTransform.exe</_TransformExe>
    
      <IncludeForTransform>@(DllsToInclude, '&amp;quot; -r &amp;quot;')</IncludeForTransform>
    </PropertyGroup>
    
    • La première partie localise TextTransform.exe

    • $(IncludeForTransform) sera égal à c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll car c'est le moyen d'ajouter des références pour TextTransform sur la ligne de commande

       <Target Name="TransformOnBuild" BeforeTargets="BeforeBuild">
         <!--<Message Text="$(IncludeForTransform)" />-->
         <Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')" />
         <ItemGroup>
           <_TextTransform Include="$(ProjectDir)**\*.tt" />
         </ItemGroup>
         <!-- Perform task batching for each file -->
         <Exec Command="&quot;$(_TransformExe)&quot; &quot;@(_TextTransform)&quot; -r &quot;$(IncludeForTransform)&quot;" Condition="'%(Identity)' != ''" />
       </Target>
      
    • <_TextTransform Include="$(ProjectDir)**\*.tt" /> Ceci crée une liste de tous les fichiers tt du projet et des sous-répertoires

    • <Exec Command="... génère pour chacun des fichiers .tt trouvés une ligne ressemblant à "C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"

  4. Il ne reste plus qu'à ajouter les chemins aux dll à l'intérieur de:

        <ItemGroup>
          <DllsToInclude Include="$(ProjectDir)path\to\foo.dll">
            <InProject>False</InProject>
          </DllsToInclude>
          <DllsToInclude Include="$(ProjectDir)path\to\bar.dll">
            <InProject>False</InProject>
          </DllsToInclude>
        </ItemGroup>
    

    Ici <InProject>False</InProject> masque ces éléments de la vue Solution

Vous devriez maintenant pouvoir générer votre code lors de la construction et du changement de dll-s.

Vous pouvez supprimer l'outil personnalisé (des propriétés de Visual Studio) afin que le système virtuel n'essaye pas de se transformer et échoue lamentablement à chaque fois. Parce que nous avons supprimé les références d'assemblage à l'étape 2

T4Executer le fait pour VS2019. Vous pouvez spécifier les modèles à ignorer lors de la construction. Il existe une option d'exécution après génération.

Un type a créé un package nuget pour cette opération.

Remarque secondaire: je reçois des erreurs de compilation de TextTemplate.exe et de ce package (car ce package appelle TextTemplate.exe), mais pas de Visual Studio. Donc, apparemment, le comportement n'est pas le même. heads up.

EDIT: Cela a fini par être mon problème.

Vous venez d'installer le package NuGet: Clarius.TransformOnBuild

Ensuite, chaque fois que vous cliquez sur le projet Reconstruire (ou la solution), vos fichiers .tt seront exécutés

.

Dans Visual Studio 2017 (probablement aussi dans les prochaines versions), vous devez ajouter ceci dans l'événement Pre-build:

"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"

p.s. Modifiez le chemin d'accès à votre modèle s'il ne se trouve pas dans le répertoire du projet racine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top