Jak uzyskać szablon T4 do generowania wyników w każdej kompilacji? Tak jak teraz, regeneruje go tylko wtedy, gdy wprowadzam zmianę w szablonie.
Znalazłem inne pytania podobne do tego:
Transformacja T4 i kolejność kompilacji w programie Visual Studio (bez odpowiedzi)
Jak zdobyć pliki T4 do kompilacji w Visual Studio? (odpowiedzi nie są wystarczająco szczegółowe [a jednocześnie są bardzo skomplikowane] i nie mają nawet całkowitego sensu)
Musi być na to prostszy sposób!
visual-studio
tfs
msbuild
t4
JoelFan
źródło
źródło
Odpowiedzi:
Użyłem odpowiedzi JoelFana, aby wymyślić to. Podoba mi się to bardziej, ponieważ nie musisz pamiętać o modyfikowaniu zdarzenia pre-build za każdym razem, gdy dodajesz nowy plik .tt do projektu.
%PATH%
transform_all ..\..
”transform_all.bat
źródło
"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"
) w pliku wsadowym, zamiast dodawać ją do% PATH%%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe
. Zawiń go w podwójne cudzysłowy.TextTransform.exe
bani. Możesz już kliknąć prawym przyciskiem myszy „Uruchom narzędzie niestandardowe” w programie Visual Studio, więc ma już ścieżkę do narzędzia. Dlaczego muszę przechodzić przez proces dostarczania go ponownie, gdy tworzę z kontekstu programu Visual Studio?Zgadzam się z GarethJ - w VS2010 o wiele łatwiej jest zregenerować szablony tt na każdej kompilacji. Blog Olega Sycha opisuje, jak to zrobić. W skrócie:
</Project>
Otóż to. Otwórz swój projekt. Przy każdej kompilacji wszystkie szablony * .tt zostaną ponownie przetworzone
źródło
msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Istnieje świetny pakiet NuGet, który robi to:
Szczegóły dotyczące pakietu można znaleźć tutaj
źródło
content
akcje kompilacji<#@ template language="C#" #>
Skorzystałem z odpowiedzi MarkGr i opracowałem to rozwiązanie. Najpierw utwórz plik wsadowy o nazwie RunTemplate.bat w oddzielnym folderze narzędzi powyżej głównego folderu rozwiązania. Plik wsadowy ma tylko wiersz:
Ten plik wsadowy przyjmuje 2 parametry ... % 1 to ścieżka do pliku .tt bez rozszerzenia .tt. % 2 jest ścieżką do żadnej biblioteki DLL określonych przez Assembly dyrektyw w szablonie.
Następnie przejdź do właściwości projektu zawierającego szablon T4. Przejdź do zdarzeń kompilacji i dodaj następujący wiersz poleceń zdarzenia przed kompilacją :
zastąpienie MyTemplate nazwą pliku twojego pliku .tt (np. MyTemplate.tt) bez rozszerzenia .tt. Spowoduje to rozszerzenie szablonu w celu utworzenia MyTemplate.cs przed zbudowaniem projektu. Następnie właściwa kompilacja skompiluje MyTemplate.cs
źródło
Niedawno znalazłem tę świetną wtyczkę VS, Chirpy .
Nie tylko generuje T4 w kompilacji, ale umożliwia oparte na T4 podejście do minifikacji javascript, CSS, a nawet pozwala na użycie MNIEJSZEJ składni dla twojego CSS!
źródło
Prawdopodobnie najprostszym sposobem jest zainstalowanie rozszerzenia Visual Studio o nazwie AutoT4 .
Automatycznie uruchamia wszystkie szablony T4 podczas kompilacji.
źródło
Wstępną kompilację można zredukować do jednej linii:
To przekształca wszystkie
.tt
pliki w projekcie i wyświetla je w danych wyjściowych kompilacji.Jeśli nie chcesz, aby wyniki kompilacji były wyświetlane, musisz obejść kilka „interesujących zachowań” :
Oczywiście możesz wyciągnąć to do pliku wsadowego, do którego możesz przekazać ścieżkę katalogu projektu, jeśli chcesz.
Uwaga : ścieżka może wymagać pewnych poprawek. Powyższa ścieżka to miejsce, w którym VS 2008 zainstalował go na moim komputerze; ale może się okazać, że numer wersji między
TextTemplating
iTextTransform.exe
jest inny.źródło
System.Exception: T4MVC can only execute through the Visual Studio host
Wyewidencjonuj C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ Text Przypominając, że jest tam plik z transformacją wiersza poleceń. Alternatywnie napisz zadanie programu MSBuild przy użyciu hosta niestandardowego i samodzielnie przeprowadź transformację.
źródło
Rozwijając odpowiedzi Setha Reno i JoelFana , wymyśliłem to. Dzięki temu rozwiązaniu nie musisz pamiętać o modyfikowaniu zdarzenia pre-build za każdym razem, gdy dodajesz nowy plik .tt do projektu.
Procedura wdrożeniowa
transform_all.bat "$(ProjectDir)" $(ProjectExt)
dla każdego projektu z plikiem .tt, który chcesz skompilowaćtransform_all.bat
UWAGI
Transformacja tekstu zakłada, że kod w szablonie T4 jest tym samym językiem, co typ projektu. Jeśli ten przypadek nie dotyczy Ciebie, będziesz musiał zastąpić
$(ProjectExt)
argument rozszerzeniem plików, które chcesz wygenerować w kodzie..TT
pliki muszą znajdować się w katalogu projektu, w przeciwnym razie nie będą budować. Możesz budować pliki TT poza katalogiem projektu, określając inną ścieżkę jako pierwszy argument ( tj. Zamień"$(ProjectDir)"
na ścieżkę zawierającą pliki TT).Pamiętaj również, aby ustawić poprawną ścieżkę do
transform_all.bat
pliku wsadowego.Na przykład umieściłem go w katalogu mojego rozwiązania, aby zdarzenie przed kompilacją wyglądało następująco
"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
źródło
t4list.txt
plik do PasteBin , abym spróbował sprawdzić, czy stamtąd pochodzi Twój błąd?for /f "delims=" %%d in (t4list.txt) do (
a ograniczenia korporacyjne uniemożliwiają opublikowaniet4list.txt
pliku, obawiam się, że niewiele mogę zrobić, aby Ci pomóc. Naprawdę chciałem pomóc rozwiązać ten problem, ale wygląda na to, że będzie to niemożliwe, ponieważ nie mam danych do kontynuowania. Powodzenia w naprawianiu problemu i pamiętaj, aby opublikować swoje rozwiązanie, gdy odniesiesz sukces.(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
? Niestety, otrzymuję zerowy wyjątek odniesienia , gdy uruchamiam tt spoza Visual Studio.Jeśli korzystasz z programu Visual Studio 2010, możesz użyć zestawu SDK do modelowania i wizualizacji programu Visual Studio: http://code.msdn.microsoft.com/vsvmsdk
Zawiera zadania msbuild do wykonywania szablonów T4 w czasie kompilacji.
Zajrzyj na blog Olega, aby uzyskać więcej informacji: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration
źródło
Hej, mój skrypt może również analizować rozszerzenie wyjścia
Po prostu utwórz
transform_all.bat $(SolutionDir)
zdarzenie pre-build, a wszystkie pliki * .tt w Twoim rozwiązaniu zostaną automatycznie przekształcone.źródło
Dynamo.AutoTT zrobi to, czego potrzebujesz. Możesz skonfigurować go do oglądania plików za pomocą wyrażenia regularnego lub generowania podczas kompilacji. Pozwala także określić, które szablony T4 mają być uruchamiane.
Możesz go pobrać stąd: https://github.com/MartinF/Dynamo.AutoTT
Po prostu zbuduj, skopiuj dll i pliki AddIn do
C: \ Users \ Documents \ Visual Studio 2012 \ Addins \
i odejdź.
Jeśli chcesz, aby wszystko działało w VS2012, musisz zmodyfikować plik Dynamo.AutoTT.AddIn i ustawić wersję na 11.0 w pliku AddIn;
źródło
Dzięki GitHub.com/Mono/T4 w tej chwili możesz to zrobić zarówno dla kompilacji .NET Core, jak i Visual Studio, dodając to do swojego
.csproj
pliku:Jeśli przekształcasz swoje szablony na różne języki programowania, powinieneś dodać coś takiego jak
<Compile Remove="**\*.vb" />
i<Compile Include="**\*.vb" />
, aby skompilować te pliki, nawet jeśli nie masz jeszcze wygenerowanych plików.Remove
iInclude
sztuczka potrzebna tylko przy pierwszym generowaniu, lub możesz skrócić XML w ten sposób:i po prostu dwukrotnie uruchom kompilację (po raz pierwszy). Jeśli wygenerowałeś już pliki zatwierdzone do repozytorium, nie będzie problemów z odbudową w obu przykładach.
W programie Visual Studio możesz chcieć zobaczyć coś takiego:
zamiast tego:
Więc dodaj coś takiego do pliku projektu:
Pełny przykład tutaj: GitHub.com/Konard/T4GenericsExample (obejmuje generowanie wielu plików z jednego szablonu).
źródło
Oto moje rozwiązanie - podobne do zaakceptowanej odpowiedzi. Wystąpił problem z naszą kontrolą źródła. Docelowe pliki .cs są tylko do odczytu, a T4 kończy się niepowodzeniem. Oto kod, który uruchamia T4 w folderze tymczasowym, porównuje pliki docelowe i kopiuje go tylko w przypadku takiej samej zmiany. Nie rozwiązuje problemu z plikami read.only, ale przynajmniej nie występuje zbyt często:
Transform.bat
Możesz spróbować dodać polecenie wypisania w wierszu (:: Możesz spróbować ....)
W swoim projekcie ustaw to jako działanie przed kompilacją:
źródło
Wystarczy dodać to polecenie do zdarzenia poprzedzającego kompilację projektu:
Funkcja check on configuration = debug zapewnia, że kod nie zostanie wygenerowany ponownie w trybie wydania, na przykład podczas tworzenia kompilacji na serwerze TFS.
źródło
W programie Visual Studio 2013 kliknij prawym przyciskiem myszy szablon T4 i ustaw właściwość transformacji przy kompilacji na true.
źródło
Oto jak to załatwiłem. Link . Zasadniczo budowanie na świetnym blogu (blogis.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ nie można publikować więcej niż 2 links :() Wymyśliłem ten plik .targets do użytku z plikami projektowymi programu Visual Studio.
Jest to przydatne, gdy używasz innych bibliotek dll wewnątrz swojego .tt i chcesz, aby wynik zmieniał się wraz ze zmianą bibliotek dll.
Jak to działa:
Usuń odwołania do zestawów z .tt
Wewnątrz pliku proj użyj tego kodu, aby skonfigurować transformację podczas kompilacji:
Pierwsza część lokalizuje TextTransform.exe
$(IncludeForTransform)
będzie równa,c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll
ponieważ jest to sposób dodawania odwołań do TextTransform w wierszu poleceń<_TextTransform Include="$(ProjectDir)**\*.tt" />
tworzy to listę wszystkich plików tt w projekcie i podkatalogach<Exec Command="...
tworzy wiersz dla każdego ze znalezionych plików .tt, który wygląda jak"C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"
Pozostało tylko dodać ścieżki do bibliotek dll wewnątrz:
Tutaj
<InProject>False</InProject>
ukrywa te elementy w widoku rozwiązaniaWięc teraz powinieneś być w stanie wygenerować swój kod przy kompilacji i zmianie bibliotek dll.
Możesz usunąć narzędzie niestandardowe (z właściwości w programie Visual Studio), aby program VS nie próbował za każdym razem przekształcić i zakończyć się niepowodzeniem. Ponieważ usunęliśmy odwołania do zestawów w kroku 2
źródło
T4Executer robi to dla VS2019. Możesz określić szablony, które mają być ignorowane podczas kompilacji, i istnieje opcja wykonania po kompilacji.
źródło
Wystarczy zainstalować pakiet NuGet : Clarius.TransformOnBuild
Następnie za każdym razem, gdy klikniesz Odbuduj projekt (lub rozwiązanie), uruchomione zostaną pliki .tt
źródło
W programie Visual Studio 2017 (prawdopodobnie także w kolejnych wersjach) należy dodać to w zdarzeniu przed kompilacją:
ps Zmień ścieżkę do szablonu, jeśli nie znajduje się w głównym katalogu projektu.
źródło
Jakiś facet zbudował w tym celu pakiet nuget .
Uwaga dodatkowa: otrzymuję błędy kompilacji zarówno z TextTemplate.exe, jak iz tego pakietu (ponieważ ten pakiet wywołuje TextTemplate.exe), ale nie z programu Visual Studio. Więc najwyraźniej zachowanie nie jest takie samo; Heads-up.
EDYCJA: To był mój problem.
źródło
Oto zdarzenie przed kompilacją przy użyciu tylko narzędzi firmy Microsoft i standardowych ścieżek. Jest testowany w vs2019 / netcore3.1.
Zastąp „AppDbContext.tt” ścieżką pliku względną projektu:
Firma Microsoft ma również przewodnik dotyczący udostępniania makr, takich jak „$ (SolutionDirectory)”, w szablonie przy użyciu T4ParameterValues w pliku projektu.
źródło