Wie bekomme ich eine T4-Vorlage, um ihre Ausgabe bei jedem Build zu generieren? So wie es jetzt ist, wird es nur neu generiert, wenn ich eine Änderung an der Vorlage vornehme.
Ich habe ähnliche Fragen gefunden:
T4-Transformation und Build-Reihenfolge in Visual Studio (unbeantwortet)
Wie bekomme ich t4-Dateien zum Erstellen in Visual Studio? (Die Antworten sind nicht detailliert genug [obwohl sie immer noch sehr kompliziert sind] und machen nicht einmal Sinn)
Es muss einen einfacheren Weg geben, dies zu tun!
visual-studio
tfs
msbuild
t4
JoelFan
quelle
quelle
Antworten:
Ich habe JoelFans Antwort benutzt, um darauf zu kommen. Mir gefällt es besser, weil Sie nicht daran denken müssen, das Pre-Build-Ereignis jedes Mal zu ändern, wenn Sie dem Projekt eine neue .tt-Datei hinzufügen.
%PATH%
transform_all ..\..
"transform_all.bat
quelle
"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"
) in die Batch-Datei aufzunehmen, anstatt ihn zu% PATH%%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe
. Wickeln Sie es in doppelte Anführungszeichen.TextTransform.exe
. Sie können in Visual Studio bereits mit der rechten Maustaste auf "Benutzerdefiniertes Tool ausführen" klicken, sodass der Pfad des Tools bereits vorhanden ist. Warum muss ich die Arbeit der erneuten Bereitstellung durchlaufen, wenn ich aus einem Visual Studio-Kontext heraus erstelle?Ich stimme GarethJ zu - in VS2010 ist es viel einfacher, tt-Vorlagen für jeden Build neu zu generieren. Oleg Sychs Blog beschreibt, wie es geht. Zusamenfassend:
</Project>
Das ist es. Öffnen Sie Ihr Projekt. Bei jedem Build werden alle * .tt-Vorlagen erneut verarbeitet
quelle
msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Es gibt ein großartiges NuGet-Paket, das genau dies tut:
Details zum Paket finden Sie hier
quelle
content
Build-Aktionen unterstützt<#@ template language="C#" #>
Ich habe die Antwort von MarkGr verwendet und diese Lösung entwickelt. Erstellen Sie zunächst eine Batchdatei mit dem Namen RunTemplate.bat in einem separaten Tools- Ordner über dem Hauptlösungsordner . Die Batch-Datei hat nur die Zeile:
Diese Batch-Datei akzeptiert 2 Parameter ... % 1 ist der Pfad zur .tt-Datei ohne die Erweiterung .tt. % 2 ist der Pfad zu allen DLLs, auf die in Assembly- Anweisungen in der Vorlage verwiesen wird .
Wechseln Sie anschließend in die Projekteigenschaften des Projekts, das die T4-Vorlage enthält. Gehen Sie zu Build Events und fügen Sie die folgende Pre-Build Event-Befehlszeile hinzu :
Ersetzen von MyTemplate durch den Dateinamen Ihrer .tt-Datei (dh MyTemplate.tt) ohne die Erweiterung .tt. Dies hat zur Folge, dass die Vorlage erweitert wird, um MyTemplate.cs zu erstellen, bevor das Projekt erstellt wird. Dann kompiliert der eigentliche Build MyTemplate.cs
quelle
Habe kürzlich dieses großartige VS-Plugin gefunden, Chirpy .
Es generiert nicht nur Ihr T4 in einem Build, sondern ermöglicht auch einen T4-basierten Ansatz zur Minimierung von Javascript, CSS und sogar die Verwendung von WENIGER Syntax für Ihr CSS!
quelle
Am einfachsten ist es wahrscheinlich, eine Visual Studio-Erweiterung namens AutoT4 zu installieren .
Alle T4-Vorlagen werden automatisch erstellt.
quelle
Der Pre-Build kann auf eine einzelne Zeile reduziert werden:
Dadurch werden alle
.tt
Dateien im Projekt transformiert und in der Build-Ausgabe aufgelistet.Wenn Sie die Build-Ausgabe nicht möchten, müssen Sie ein "interessantes Verhalten" umgehen :
Natürlich können Sie dies in eine Batch-Datei ziehen, an die Sie den Projektverzeichnispfad übergeben, wenn Sie dies wünschen.
Hinweis: Der Pfad muss möglicherweise angepasst werden. Im obigen Pfad hat VS 2008 es auf meinem Computer installiert. Möglicherweise stellen Sie jedoch fest, dass die Versionsnummer zwischen
TextTemplating
undTextTransform.exe
unterschiedlich ist.quelle
System.Exception: T4MVC can only execute through the Visual Studio host
Schauen Sie sich C: \ Programme (x86) \ Gemeinsame Dateien \ Microsoft Shared \ TextTemplating an. Dort befindet sich eine Befehlszeilentransformations-Exe. Alternativ können Sie eine MSBuild-Aufgabe mit einem benutzerdefinierten Host schreiben und die Transformation selbst durchführen.
quelle
Ich habe die Antworten von Seth Reno und JoelFan erweitert und mir das ausgedacht . Bei dieser Lösung müssen Sie nicht daran denken, das Pre-Build-Ereignis jedes Mal zu ändern, wenn Sie dem Projekt eine neue .tt-Datei hinzufügen.
Implementierungsverfahren
transform_all.bat "$(ProjectDir)" $(ProjectExt)
für jedes Projekt ein Pre-Build-Ereignis mit einer .tt, die Sie erstellen möchtentransform_all.bat
ANMERKUNGEN
Bei der Textumwandlung wird davon ausgegangen, dass der Code in der T4-Vorlage dieselbe Sprache wie Ihr Projekttyp hat. Wenn dieser Fall für Sie nicht zutrifft, müssen Sie das
$(ProjectExt)
Argument durch die Erweiterung der Dateien ersetzen, die der Code generieren soll..TT
Dateien müssen sich im Projektverzeichnis befinden, sonst werden sie nicht erstellt. Sie können TT-Dateien außerhalb des Projektverzeichnisses erstellen, indem Sie als erstes Argument einen anderen Pfad angeben ( dh durch"$(ProjectDir)"
den Pfad ersetzen, der die TT-Dateien enthält).Denken Sie auch daran, den richtigen Pfad zur
transform_all.bat
Batch-Datei festzulegen.Zum Beispiel habe ich es in mein Lösungsverzeichnis gestellt, sodass das Pre-Build-Ereignis wie folgt war
"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
quelle
t4list.txt
Datei in PasteBin posten, damit ich versuche, festzustellen , ob Ihr Fehler von dort kommt?for /f "delims=" %%d in (t4list.txt) do (
und Unternehmensbeschränkungen Sie daran hindern, Ihret4list.txt
Datei zu veröffentlichen, kann ich leider nicht viel tun, um Ihnen zu helfen. Ich wollte wirklich helfen, dieses Problem zu lösen, aber es sieht so aus, als ob es unmöglich sein wird, da ich keine Daten habe, um fortzufahren. Viel Glück bei der Behebung des Problems und denken Sie bitte daran, Ihre Lösung zu veröffentlichen, wenn Sie erfolgreich sind.(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
? Leider erhalte ich eine Nullreferenzausnahme , wenn ich tt nicht im Visual Studio ausführe .Wenn Sie Visual Studio 2010 verwenden, können Sie das Visual Studio-Modellierungs- und Visualisierungs-SDK verwenden: http://code.msdn.microsoft.com/vsvmsdk
Dies enthält msbuild-Aufgaben zum Ausführen von T4-Vorlagen zur Erstellungszeit.
Weitere Erklärungen finden Sie in Olegs Blog: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration
quelle
Hey, mein Skript kann auch die Ausgabeerweiterung analysieren
Erstellen Sie einfach ein
transform_all.bat $(SolutionDir)
Pre-Build-Ereignis, und alle * .tt-Dateien in Ihrer Lösung werden automatisch transformiert.quelle
Dynamo.AutoTT macht das, was Sie brauchen. Sie können es so konfigurieren, dass Dateien über einen regulären Ausdruck überwacht oder beim Erstellen generiert werden. Außerdem können Sie angeben, welche T4-Vorlagen ausgelöst werden sollen.
Sie können es hier herunterladen: https://github.com/MartinF/Dynamo.AutoTT
Erstellen Sie es einfach, kopieren Sie die DLL- und AddIn-Dateien in
C: \ Benutzer \ Dokumente \ Visual Studio 2012 \ Addins \
und los gehts.
Wenn Sie es in VS2012 zum Laufen bringen möchten, müssen Sie die Datei Dynamo.AutoTT.AddIn ändern und die Version in der AddIn-Datei auf 11.0 setzen.
quelle
Dank GitHub.com/Mono/T4 können Sie dies derzeit sowohl für .NET Core- als auch für Visual Studio-Builds tun, indem Sie Folgendes zu Ihrer
.csproj
Datei hinzufügen :Wenn Sie Ihre Vorlagen in verschiedene Programmiersprachen umwandeln, sollten Sie so etwas wie
<Compile Remove="**\*.vb" />
und hinzufügen<Compile Include="**\*.vb" />
, um diese Dateien zu kompilieren, auch wenn Sie noch keine Dateien generiert haben.Remove
undInclude
Trick nur für die erste Generierung benötigt, oder Sie können das XML-kürzer wie folgt machen:und führen Sie build einfach zweimal aus (zum ersten Mal). Wenn Sie bereits Dateien generiert haben, die für das Repository festgeschrieben wurden, treten bei Neuerstellungen mit beiden Beispielen keine Probleme auf.
In Visual Studio möchten Sie möglicherweise Folgendes sehen:
an Stelle von:
Fügen Sie Ihrer Projektdatei also Folgendes hinzu:
Vollständiges Beispiel hier: GitHub.com/Konard/T4GenericsExample (beinhaltet die Generierung mehrerer Dateien aus einer einzigen Vorlage).
quelle
Hier ist meine Lösung - ähnlich der akzeptierten Antwort. Wir hatten ein Problem mit unserer Quellcodeverwaltung. Die CS-Zieldateien sind schreibgeschützt und der T4 ist ausgefallen. Hier ist der Code, der T4 im temporären Ordner ausführt, Zieldateien vergleicht und nur bei derselben Änderung kopiert. Es behebt das Problem mit read.only-Dateien nicht, tritt jedoch zumindest nicht sehr häufig auf:
Transform.bat
Sie können versuchen, Ihren Check-out-Befehl in eine Zeile einzufügen (:: Sie können versuchen ....)
Stellen Sie dies in Ihrem Projekt als vorgefertigte Aktion ein:
quelle
Sie müssen diesen Befehl nur zum Pre-Build-Ereignis des Projekts hinzufügen:
Durch die Überprüfung von configuration = debug wird sichergestellt, dass Sie den Code nicht im Freigabemodus neu generieren, wenn Sie beispielsweise den Build auf dem TFS-Buildserver ausführen.
quelle
Klicken Sie in Visual Studio 2013 mit der rechten Maustaste auf die T4-Vorlage und setzen Sie die Eigenschaft "Transformation on Build" auf "true".
quelle
Hier ist, wie ich es angepackt habe. Link . Aufbauend auf einem großartigen Blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ kann nicht mehr als 2 posten links :() Ich habe mir diese .targets- Datei für die Verwendung mit Visual Studio-Projektdateien ausgedacht.
Dies ist nützlich, wenn Sie andere DLLs in Ihrer .tt verwenden und möchten, dass sich das Ergebnis ändert, wenn sich die DLLs ändern.
Wie es funktioniert:
Entfernen Sie die Assemblyreferenzen aus .tt
Verwenden Sie diesen Code in der proj-Datei, um die Transformation beim Erstellen einzurichten:
Erster Teil Findet TextTransform.exe
$(IncludeForTransform)
wird gleich sein,c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll
da auf diese Weise Referenzen für die TextTransform in der Befehlszeile hinzugefügt werden<_TextTransform Include="$(ProjectDir)**\*.tt" />
Dadurch wird eine Liste aller tt-Dateien im Projekt und in den Unterverzeichnissen erstellt<Exec Command="...
Erzeugt eine Zeile für jede der gefundenen .tt-Dateien, die aussieht"C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"
Sie müssen nur noch die Pfade zu den DLLs in folgenden Bereichen hinzufügen:
Hier werden
<InProject>False</InProject>
diese Elemente in der Lösungsansicht ausgeblendetJetzt sollten Sie in der Lage sein, Ihren Code beim Erstellen und Ändern von DLLs zu generieren.
Sie können das benutzerdefinierte Tool (aus den Eigenschaften in Visual Studio) entfernen, damit der VS nicht jedes Mal versucht, eine Transformation durchzuführen und kläglich fehlzuschlagen. Weil wir die Assemblyreferenzen in Schritt 2 entfernt haben
quelle
T4Executer erledigt dies für VS2019. Sie können Vorlagen angeben, die beim Erstellen ignoriert werden sollen, und es gibt eine Option zum Ausführen nach dem Erstellen.
quelle
Sie installieren einfach das NuGet-Paket: Clarius.TransformOnBuild
Jedes Mal, wenn Sie auf Projekt (oder Lösung) neu erstellen klicken , werden Ihre .tt- Dateien ausgeführt
quelle
In Visual Studio 2017 (wahrscheinlich auch in den nächsten Versionen) sollten Sie dies im Pre-Build-Ereignis hinzufügen:
ps Ändern Sie den Pfad zu Ihrer Vorlage, wenn sie sich nicht im Stammprojektverzeichnis befindet.
quelle
Ein Typ hat dafür ein Nuget-Paket gebaut .
Randnotiz: Ich erhalte Kompilierungsfehler sowohl von TextTemplate.exe als auch von diesem Paket (da dieses Paket TextTemplate.exe aufruft), jedoch nicht von Visual Studio. Anscheinend ist das Verhalten also nicht dasselbe. Kopf hoch.
EDIT: Dies war mein Problem.
quelle
Hier ist ein Pre-Build-Ereignis, das nur Microsoft Tooling und Standardpfade verwendet. Es wurde in vs2019 / netcore3.1 getestet.
Ersetzen Sie "AppDbContext.tt" durch Ihren projektbezogenen Dateipfad:
Microsoft hat auch eine Anleitung, um Makros wie "$ (SolutionDirectory)" in der Vorlage verfügbar zu machen, indem Sie T4ParameterValues in Ihrer Projektdatei verwenden.
quelle