Demandez à Visual Studio d'exécuter un modèle T4 sur chaque build

164

Comment obtenir un modèle T4 pour générer sa sortie sur chaque build? Dans l'état actuel des choses, 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 à construire dans Visual Studio? (les réponses ne sont pas assez détaillées [tout en étant encore très compliquées] et n'ont même pas de sens)

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

JoelFan
la source
Bien que je serais personnellement très intéressé d'entendre une réponse à cela, quel est votre scénario particulier? Normalement, la sortie du modèle doit être une fonction de l'entrée uniquement, donc générer sur changement est très bien.
Pavel Minaev
6
Mon modèle utilise la réflexion pour examiner d'autres assemblys, qui peuvent avoir changé depuis la dernière génération.
JoelFan
Qu'en est-il de cette idée: stackoverflow.com/questions/1649649/…
JoelFan
Mon modèle a un seul but, enregistrer l'heure de la date de construction.
Scott Solmer

Réponses:

69

J'ai utilisé la réponse de JoelFan pour venir avec ça. Je l'aime mieux car vous n'avez pas à vous rappeler de modifier l'événement de pré-construction chaque fois que vous ajoutez un nouveau fichier .tt au projet.

  • ajoutez TextTransform.exe à votre %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
Seth Reno
la source
28
Belle solution. J'ai préféré mettre le chemin complet de TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe") dans le fichier de commandes, plutôt que de l'ajouter à% PATH%
Adam Nofsinger
20
Une meilleure variable serait% COMMONPROGRAMFILES (x86)% au lieu de% COMMONPROGRAMFILES% car cela fonctionnerait également sur un système 64 bits.
Durden81
3
Donc, le chemin complet sera %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Entourez-le de guillemets doubles.
northben
1
@ piers7: J'ai mis à jour le code pour détecter automatiquement le 'bitness' du système d'exploitation qui exécute le script. J'ai également inclus le commentaire de northben pour ignorer le répertoire obj et implémenté la préférence d'Adam Nofsinger sur la non-modification de la variable d'environnement% PATH%.
Alex Essilfie
1
IMHO avoir à fournir le chemin à TextTransform.exesucer. Vous pouvez déjà cliquer avec le bouton droit sur «Exécuter l'outil personnalisé» dans Visual Studio, afin qu'il dispose déjà du chemin d'accès de l'outil. Pourquoi dois-je refaire le travail de le fournir lorsque je crée à partir d'un contexte Visual Studio?
Jez
70

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

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

C'est tout. Ouvrez votre projet. Sur chaque build, 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" />
Cheburek
la source
2
Voici un lien vers le billet de blog d'Oleg Sych
PhilChuang
4
C'est une très belle solution. Cependant, existe-t-il un moyen de faire fonctionner cela sans nécessiter l'installation des SDK? J'ai essayé de le faire fonctionner en copiant les fichiers .targets et les assemblys associés, mais sans succès.
grimus
3
Chirpy semble fonctionner sans avoir à télécharger de SDK ... cependant, vous devez toujours télécharger et configurer Chirpy. J'essaie toujours de découvrir une solution qui fonctionne sur une installation par défaut de VS2010, et qui sera disponible via le référentiel source afin que les développeurs n'aient qu'à vérifier le dépôt pour que cela fonctionne. Toutes ces autres solutions nécessitent beaucoup trop d'attention par développeur.
Mir
1
Si vous générez vos projets en utilisant la version x64 de MSBuild - vous obtiendrez cette erreur: 'MSB4019: Le projet importé "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " n'a pas été trouvé.' Erreur. Solution de contournement - remplacez la variable $ (MSBuildExtensionsPath) par $ (MSBuildExtensionsPath32) dans un fichier projet.
Rusted
3
De plus, vous n'avez pas besoin de patcher les fichiers .csproj. À partir de la ligne de commande, invoquez quelque chose comme msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Giulio Vian
30

Il existe un excellent package NuGet qui fait exactement cela:

PM> Install-Package Clarius.TransformOnBuild

Les détails sur le package peuvent être trouvés ici

GavKilbride
la source
2
Il existe un fork `` non officiel '': nuget.org/packages/Clarius.TransformOnBuild-unofficial qui prend en charge les contentactions de construction
Erno
1
Il est bien l' extension , mais il est en cours d' exécution en mode TextTransform.exe commandLine, donc hostspecific = « true » funcions sera le travail non
GH61
2
@JenishRabadiya Ajoutez cette ligne en haut du modèle:<#@ template language="C#" #>
Peter van Kekem
3
Il semble que le package a été mis à jour pour prendre en charge hostspecific = "true" et d'autres problèmes (il y a 8 jours)
Mingwei Samuel
1
L'action de création de contenu fonctionne désormais avec la dernière version.
androbin
20

J'ai utilisé la réponse de MarkGr et développé cette solution. Tout d'abord, créez un fichier de commandes appelé RunTemplate.bat dans un dossier d' outils distinct au-dessus du dossier de solution principal. 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 de commandes prend 2 paramètres ... % 1 est le chemin d'accès au fichier .tt sans l'extension .tt. 2% est le chemin vers les DLL visées par l' Assemblée directives dans le modèle.

Ensuite, allez dans les propriétés du projet du projet contenant le modèle T4. Accédez aux événements de construction et ajoutez la ligne de commande d'événement de pré-construction suivante :

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

en remplaçant MyTemplate par 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 générer le projet. Ensuite, la version réelle compilera MyTemplate.cs

JoelFan
la source
même si j'ai toujours le problème: stackoverflow.com/questions/1669893/…
JoelFan
1
N'oubliez pas les guillemets autour de $ (SolutionDir) .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman
14

Récemment trouvé ce super plugin VS, Chirpy .

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

Mark Melville
la source
13

Le moyen le plus simple consiste probablement à installer une extension Visual Studio appelée AutoT4 .

Il exécute tous les modèles T4 lors de la construction de manière automatique.

Saul
la source
D'accord! Configurable et fonctionne avec VS 2015. Il prend même en charge l'utilisation de l'assembly EnvDTE (pour obtenir la configuration de construction), ce que toutes les méthodes ne font pas. Le seul inconvénient est que tous les membres de l'équipe doivent installer l'extension.
Gyromite
12

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"

Cela transforme tous les .ttfichiers du projet et les répertorie dans la sortie de construction.

Si vous ne voulez pas la sortie de construction, 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 ceci dans un fichier batch auquel vous transmettez le chemin du répertoire du projet si vous le souhaitez.

NB Le chemin peut nécessiter quelques ajustements. Le chemin ci-dessus est l'endroit où VS 2008 l'a installé sur ma machine; mais vous constaterez peut-être que le numéro de version entre TextTemplatinget TextTransform.exeest différent.

Peter Taylor
la source
@SprintStar, si vous avez VS 2012, il existe probablement une meilleure façon de le faire. D'autres réponses parlent de meilleures façons déjà existantes pour VS 2010.
Peter Taylor
C'est la meilleure méthode, car je n'ai rien à installer.
Ryan Gates
1
J'ai vu qu'il n'y avait pas de 1.2 mais il y avait un 12.0, alors l' System.Exception: T4MVC can only execute through the Visual Studio host
avez
1
Il suffit de mettre à jour le chemin du dossier pour utiliser 14.0 au lieu de 1.2 et c'est bon.
pistol-pete
C'était la meilleure solution à mon avis (il suffit de changer 14.0 comme mentionné ci-dessus)
Nelson Rodriguez
9

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

MarkGr
la source
1
Oh, bien que vous puissiez faire des trucs comme "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln" en 2010, il a tendance à se casser sur les serveurs de construction de temps en temps. Votre meilleur pari est d'écrire une tâche MSBuild avec un hôte personnalisé.
MarkGr
Pour les versions de bureau, créez simplement une macro qui effectue un TransformAllTemplates, puis une version.
MarkGr
7

En développant les réponses de Seth Reno et JoelFan , je suis venu avec ceci. 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 batch 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 un .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


REMARQUES

  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 s'applique pas à vous, vous devrez alors remplacer l' $(ProjectExt)argument par l'extension des fichiers que vous souhaitez que le code génère.

  2. .TTles fichiers doivent être dans le répertoire du projet sinon ils ne seront pas compilé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 ( c'est-à-dire remplacer "$(ProjectDir)"par le chemin contenant les fichiers TT.)

  3. N'oubliez pas également de définir le chemin d'accès correct au transform_all.batfichier de commandes.
    Par exemple, je l'ai placé dans mon répertoire de solution pour que l'événement de pré-construction soit le suivant"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)

Alex Essilfie
la source
J'essaie d'utiliser cette approche, mais j'obtiens toujours une erreur, avec '\ Common était inattendu à ce moment.' dans ma sortie. Cela arrive juste à cette ligne: pour / f "delims =" %% d dans (t4list.txt) do ... Une idée de ce qui me manque?
Michael Lewis
@MichaelLewis: J'ai parcouru le fichier batch plusieurs fois sans repérer ce qui pourrait être à l'origine de l'erreur. Veuillez essayer la méthode proposée par Seth Reno pour voir si elle génère la même erreur. En attendant, pouvez-vous poster votre t4list.txtfichier sur PasteBin pour que j'essaie de voir si votre erreur vient de là?
Alex Essilfie
J'ai essayé l'approche de Seth avec le même problème («\ Common était inattendu à ce moment»). Je ne peux pas publier le fichier t4list.txt en raison de restrictions d'entreprise, mais il se compose d'une ligne et \ Common n'apparaît pas dans le chemin.
Michael Lewis
@MichaelLewis: Malheureusement, si votre erreur survient for /f "delims=" %%d in (t4list.txt) do (et que les restrictions d'entreprise vous empêchent de publier votre t4list.txtfichier, je crains que je ne puisse pas faire grand-chose pour vous aider. J'avais vraiment voulu aider à résoudre ce problème, mais il semble que ce sera impossible car je n'ai pas de données pour continuer. Bonne chance pour résoudre le problème et n'oubliez pas de publier votre solution lorsque vous réussissez.
Alex Essilfie
Est-il possible de faire la même chose quand tt contient (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Malheureusement, j'obtiens une exception de référence nulle , lorsque je lance tt depuis l'extérieur de Visual Studio.
Andrey K.
4

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%

Créez simplement transform_all.bat $(SolutionDir)un événement de pré-construction et tous les fichiers * .tt de votre solution seront transformés automatiquement.

MadRabbit
la source
3

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

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

Construisez-le, copiez les fichiers dll et AddIn dans

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

et c'est parti.

Si vous voulez le faire démarrer dans VS2012, vous devrez modifier le fichier Dynamo.AutoTT.AddIn et définir la version sur 11.0 dans le fichier AddIn;

Matware
la source
3

Merci à GitHub.com/Mono/T4 , pour le moment, vous pouvez le faire pour les versions .NET Core et Visual Studio en ajoutant ceci à votre .csprojfichier:

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Compile Remove="**\*.cs" />
    </ItemGroup>
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
    <ItemGroup>
      <Compile Include="**\*.cs" />
    </ItemGroup>
  </Target>

Si vous transformez vos modèles en différents langages de programmation, vous devez ajouter quelque chose comme <Compile Remove="**\*.vb" />et <Compile Include="**\*.vb" />pour que ces fichiers soient compilés même si vous n'avez pas encore généré de fichiers.

Removeet Includeastuce uniquement nécessaire pour la première génération, ou vous pouvez raccourcir le XML comme ceci:

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
  </Target>

et exécutez simplement build deux fois (pour la première fois). Si vous avez déjà généré des fichiers validés dans le référentiel, il n'y aura aucun problème lors des reconstructions avec les deux exemples.

Dans Visual Studio, vous souhaiterez peut-être voir quelque chose comme ceci:

entrez la description de l'image ici

au lieu de cela:

entrez la description de l'image ici

Ajoutez donc quelque chose comme ceci à votre fichier de projet:

  <ItemGroup>
    <Compile Update="UInt16Class.cs">
      <DependentUpon>UInt16Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt32Class.cs">
      <DependentUpon>UInt32Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt64Class.cs">
      <DependentUpon>UInt64Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt8Class.cs">
      <DependentUpon>UInt8Class.tt</DependentUpon>
    </Compile>
  </ItemGroup>

Exemple complet ici: GitHub.com/Konard/T4GenericsExample (inclut la génération de plusieurs fichiers à partir d'un seul modèle).

Konard
la source
1

Voici ma solution - similaire à 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 a échoué. Voici le code, qui exécute T4 dans le dossier temporaire, compare les fichiers cibles et ne le copie qu'en cas de même changement. Cela ne résout pas le problème avec les 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 ceci comme une action de pré-construction:

Path-To-Transform.bat "$(ProjectDir)"
Ondra
la source
1

Il vous suffit d'ajouter cette commande à l'événement de pré-construction 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, garantit que vous ne régénérez pas le code en mode release, lorsque vous faites la compilation sur le serveur de build TFS par exemple.

anoop
la source
Bien mais tout transformer pourrait être dangereux si T4MVC n'est pas seulement tt dans le projet et que nous ne voulons pas tout exécuter ...
Landeeyo
3
Je n'ai pas TextTemplating dans le dossier v11.0. D'où vient ça?
Zack
1

Dans Visual Studio 2013, cliquez avec le bouton droit sur le modèle T4 et définissez la propriété transform on build sur true.

user1607685
la source
1
Je ne parviens pas à trouver cette option dans le menu contextuel, mais selon MSDN, il est possible de le faire en éditant le fichier de projet dans VS 2012 et 2013, voir msdn.microsoft.com/en-us/library/ee847423. aspx ou msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx pour plus de détails
yoel halb
Cela semble être une option fournie uniquement avec les outils T4 tangibles, et non par défaut dans Visual Studio.
Matt DiTrolio
Ouais, ce n'est que dans la version pro de T4 Toolbox.
Pompair
1

Voici comment je l'ai abordé. Lien . Fondamentalement, en s'appuyant sur un excellent blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ ne peut pas publier plus de 2 links :() J'ai créé ce fichier .targets à utiliser avec les fichiers proj de Visual Studio.

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

Comment ça fonctionne:

  1. Créez le tt, ajoutez le nom de l'assembly = "$ (SolutionDir) path \ to \ other \ project \ output \ foo.dll et configurez la transformation et le résultat comme prévu
  2. Supprimer les références d'assembly 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.dllcar c'est la façon d'ajouter des références pour le 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" />cela crée une liste de tous les fichiers tt à l'intérieur du projet et des sous-répertoires

    • <Exec Command="... produit une ligne pour chacun des fichiers .tt trouvés qui ressemble à "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. La seule chose à faire est d'ajouter les chemins vers les 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

Alors maintenant, vous devriez être en mesure de générer votre code lors de la compilation et du changement de dll-s.

Vous pouvez supprimer l'outil personnalisé (des propriétés à l'intérieur de Visual Studio) afin que le VS 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

Georgi
la source
Veuillez ajouter la solution elle-même à votre réponse pour fournir plus de contexte. Les liens ne sont pas des solutions à la question et peuvent être morts lorsque d'autres utilisateurs reviennent sur cette question plus tard.
Frank van Wijk
1

T4Executer fait cela pour VS2019. Vous pouvez spécifier des modèles à ignorer lors de la construction, et il existe une option d'exécution après la construction.

Tim Maes
la source
1

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

Ensuite, chaque fois que vous cliquez sur Rebuild project (ou Solution), vos fichiers .tt s'exécuteront

dqthe
la source
1

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

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

ps Modifiez le chemin de votre modèle s'il ne se trouve pas dans le répertoire racine du projet.

aléatoire
la source
0

Un type a construit un paquet nuget pour ça.

Remarque: j'obtiens 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; la tête haute.

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

Grault
la source
0

Voici un événement de pré-construction utilisant uniquement les outils Microsoft et les chemins standard. Il est testé dans vs2019 / netcore3.1.

Remplacez "AppDbContext.tt" par le chemin de fichier relatif à votre projet:

"$(MSBuildBinPath)\msbuild" $(SolutionPath) /t:$(ProjectName):Transform /p:TransformFile="AppDbContext.tt" /p:CustomAfterMicrosoftCommonTargets="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets"

Microsoft a également un guide pour rendre des macros telles que "$ (SolutionDirectory)" disponibles dans le modèle en utilisant T4ParameterValues dans votre fichier de projet.

npjohns
la source