Frage

Wie erhalte ich eine T4-Vorlage die Ausgabe auf jedem Build zu generieren? So wie es jetzt ist, regeneriert es nur, wenn ich eine Änderung an der Vorlage zu machen.

Ich habe andere Fragen ähnlich wie diese gefunden:

T4 Transformation und bauen, um in Visual Studio ( unbeantwortet)

Wie kommt man T4-Dateien in visuellen zu bauen Studio? (Antworten sind nicht detailliert genug [während noch viel komplizierter zu sein] und nicht einmal total Sinn machen)

Es hat bekam ein einfacherer Weg, dies zu tun!

War es hilfreich?

Lösung

Ich habe JoelFan Antwort w / diese zu entwickeln. Ich mag es besser, weil Sie müssen nicht daran denken, das Pre-Build-Ereignis eine neue .tt Datei in das Projekt jedes Mal zu ändern.

  • hinzufügen TextTransform.exe zu Ihrem %PATH%
  • erstellt eine Batch-Datei mit dem Namen transform_all.bat (siehe unten)
  • erstellen Pre-Build-Ereignis "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

Andere Tipps

Ich bin mit GarethJ - in VS2010 es viel einfacher ist tt Vorlagen auf jedem Build zu regenerieren. Oleg Sych Blog beschreibt, wie es zu tun. Kurz gesagt:

  1. Installieren Visual Studio SDK
  2. Installieren Visual Studio 2010 Modellierung und Visualization SDK
  3. Öffnen in Texteditor Projektdatei und bis zum Ende der Datei hinzufügen, aber vor </Project>

Das ist es. Öffnen Sie Ihr Projekt. Auf jeden Build alle * .tt Vorlagen wiederaufbereitet werden

<!-- 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" />

Es gibt ein großes NuGet Paket, das genau dies tut:

PM> Install-Package Clarius.TransformOnBuild

Details über das Paket kann sein hier

Ich habe Markgr Antwort und diese Lösung entwickelt. Erstellen Sie zunächst eine Batch-Datei mit dem Namen RunTemplate.bat in einem separaten Tools Ordner über dem Hauptlösungsordner. Die Batch-Datei hat nur die Zeile:

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

Diese Batchdatei dauert 2 Parameter ... % 1 ist der Pfad zu der .tt Datei ohne die Erweiterung .tt. 2% ist der Pfad zu irgendeinem genannten DLLs von Montag Richtlinien in der Vorlage.

Als nächstes geht in die Projekteigenschaften des Projektes die T4-Vorlage enthält. Gehen Sie in Build Event und fügen Sie die folgende Pre-Build-Ereignis Befehlszeile :

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

ersetzt MyTemplate mit dem Dateinamen Ihrer .tt Datei (das heißt MyTemplate.tt) ohne die .tt Erweiterung. Dies wird das Ergebnis der Vorlage erweitert MyTemplate.cs zu erzeugen, bevor das Projekt zu bauen. Danach wird die aktuelle Build wird MyTemplate.cs kompilieren

Vor kurzem fand dieses große VS-Plugin, Chirpy .

Nicht nur, dass es Ihre T4 auf einem Build zu erzeugen, aber es ermöglicht T4-basierter Ansatz zu minification von Javascript, CSS, und können Sie sogar WENIGER Syntax für CSS verwenden!

Wahrscheinlich ist der einfachste Weg, um eine Visual Studio-Erweiterung installieren namens AutoT4 .

Es läuft alle T4-Vorlagen auf Build automagically.

Das Pre-Build kann auf eine einzige Zeile reduziert werden:

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

Das wandelt alle .tt Dateien im Projekt und listet sie auf die Build-Ausgabe.

Wenn Sie nicht möchten, dass die Build-Ausgabe dann muss man um einige „interessantes Verhalten“ arbeiten:

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

Natürlich können Sie diese in einer Batch-Datei herausziehen, an dem Sie das Projekt Verzeichnispfad übergeben, wenn Sie es wünschen.

NB Der Pfad kann einige Optimierungen erforderlich. Der Pfad oben ist, wo VS 2008 es auf meinem Rechner installiert ist; aber Sie können feststellen, dass die Versionsnummer zwischen TextTemplating und TextTransform.exe unterschiedlich ist.

Überprüfen Sie heraus C: \ Program Files (x86) \ Gemeinsame Dateien \ Microsoft Shared \ TextTemplating gibt es eine Transformation exe Kommandozeile in dort. Alternativ schreibt eine MSBuild-Aufgabe mit einem benutzerdefinierten Host und kann die Transformation selbst.

Hey, mein Skript kann auch Ausgangserweiterung analysiert

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%

Erstellen Sie einfach transform_all.bat $(SolutionDir) Pre-Build-Ereignis, und alle * .tt Dateien in Ihrer Lösung werden automatisch umgewandelt werden.

Dynamo.AutoTT wird tun, was Sie brauchen. Sie können es so konfigurieren, Dateien über einen regulären Ausdruck zu beobachten oder auf Build generieren. Es erlaubt Ihnen auch angeben, welche T4-Vorlagen Sie es auslösen soll.

Sie können es hier herunterladen: https://github.com/MartinF/Dynamo.AutoTT

bauen Sie es einfach, kopieren Sie die DLL und AddIn-Dateien in

C: \ Benutzer \ Dokumente Visual Studio 2012 \ Addins \ \

und gehen Sie weg.

Wenn Sie erhalten möchten es in VS2012 gehen Sie müssen die eine Dynamo.AutoTT.AddIn Datei ändern und die Version 11.0 in der AddIn-Datei festgelegt;

Hier ist meine Lösung - ähnlich wie die akzeptierte Antwort. Wir hatten ein Problem mit unserer Quellcodeverwaltung. Das Ziels CS-Dateien sind schreibgeschützt und die T4 versagt. Hier ist der Code, der T4 in temporären Ordner ausgeführt wird, vergleicht Zieldateien und kopiert es nur bei gleichen Veränderungen. Es ist nicht das Problem mit read.only Dateien zu beheben, aber zumindest ist es nicht auftritt, sehr oft:

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

Sie können versuchen, Ihren Check-out-Befehl auf einer Zeile hinzufügen (:: Sie können versuchen, ....)

In Ihrem Projekt setzen dies als vorkompilierte Aktion:

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

Sie müssen nur diesen Befehl, um das Pre-Build-Ereignis des Projektes hinzuzufügen:

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

Die Überprüfung Konfiguration = debug, stellt sicher, dass Sie den Code in dem Freigabemodus nicht regenerieren, wenn Sie den Build auf der TFS-Server zum Beispiel bauen zu tun.

In Visual Studio 2013, rechts die T4-Vorlage klicken und die auf Build-Eigenschaft auf true gesetzt verwandeln.

Hier ist, wie ich es geheftet. Link-. Grundsätzlich baut auf einem großen Blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ kann nicht mehr schreiben, dass 2 Links :() kam ich mit dieser .targets Datei für die Verwendung auf mit Visual Studio proj Dateien.

Es ist nützlich, wenn Sie andere dll-s innerhalb Ihrer .tt verwenden und Sie wollen das Ergebnis als dll-s zu ändern, ändern sich.

Wie es funktioniert:

  1. Erstellen Sie die tt, fügen Sie den Namen der Assembly = "$ (SolutionDir) Pfad \ anderen \ Projekt \ output \ foo.dll auf \ und die Transformation und Ergebnis eingerichtet werden wie erwartet
  2. die Montage Referenzen von .tt entfernen

  3. Innerhalb der Datei Verwendung proj diesen Code up-Transformation auf Build setzen:

    <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>
    
    • Der erste Teil Lokalisiert TextTransform.exe

    • $(IncludeForTransform) wird gleich c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll denn das ist der Weg, Referenzen für die texttransform auf der Kommandozeile hinzufügen

       <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" />this erstellt eine Liste aller tt Dateien innerhalb des Projekts und Unterverzeichnisse

    • <Exec Command="... erzeugt eine Linie für jede der gefundenen .tt Dateien, die wie "C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll" aussieht

  4. Das einzige, was die Pfade zu dem DLLs innerhalb von links zu tun ist hinzuzufügen:

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

    Hier <InProject>False</InProject> verbirgt diese Elemente aus der Paaransicht

So, jetzt sollten Sie in der Lage sein, Ihren Code auf Build zu erzeugen und über den Wechsel der dll-s.

Sie können das Spezialwerkzeug entfernen (von Eigenschaften innerhalb von Visual Studio), so dass der VS nicht versucht, zu transformieren und scheitert kläglich jedes Mal. Weil wir die Montage Referenzen in Schritt 2

entfernt

T4Executer tut dies für VS2019. Sie können Vorlagen angeben, auf Build zu ignorieren, und es gibt ein nach Build-Option auszuführen.

ein Typ nuget Paket für diese.

Side Hinweis: bekomme ich Fehler kompilieren von beiden TextTemplate.exe und das Paket (weil das Paket nennt TextTemplate.exe), aber nicht von Visual Studio. So offensichtlich ist das Verhalten nicht gleich sind; leitet.

EDIT: Diese mein Problem endet als

.

Sie haben soeben installieren NuGet Paket: Clarius.TransformOnBuild

Dann jedes Mal klicken Sie auf neu erstellen Projekt (oder Lösung), Ihre .tt Dateien ausgeführt werden sollen

In Visual Studio 2017 (wahrscheinlich auch im nächsten Version), sollten Sie diese in Pre-Build-Ereignisse hinzu:

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

P. S. Ändern Pfad zu Ihrer Vorlage, wenn sie nicht im Stammprojektverzeichnis befinden wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top