2010-10-27 9 views
10

Kiedy edytuję T4, skrypt jest wykonywany za każdym razem, gdy przełączam się do innego pliku. Jest to w porządku dla szybkich prostych skryptów, ale wykonanie niektórych skryptów zajmuje dużo czasu. Czy istnieje sposób, aby wyłączyć to zachowanie? Chcę, aby skrypt działał tylko wtedy, gdy zapiszę plik T4 lub ręcznie wybierz "Uruchom narzędzie niestandardowe" z menu.Jak zatrzymać uruchamianie T4 za każdym razem, gdy przełączam się na inną kartę?

Odpowiedz

5

T4 jest podłączony do niestandardowego mechanizmu narzędziowego (IVsSingleFileGenerator) w systemach projektowych C#/VB, co daje mu uruchamianie przy zapisywaniu, uruchamianie menu niestandardowego narzędzia, a także uruchamianie przy zachowaniu przełączania kart - wszystko za cenę implementacji prosty interfejs.

Niestety oznacza to, że T4 również nie ma praktycznie żadnej kontroli nad tymi zachowaniami, które są standardem dla narzędzi niestandardowych.

Alternatywą może być użycie obsługi T4 MsBuild w zestawie SDK modelowania i wizualizacji VS, aby wykonać T4 w czasie kompilacji, a następnie wyłączyć niestandardowe narzędzie. Zapytam mojego kolegę, który zbudował obsługę msbuild, jeśli używa niestandardowego narzędzia do identyfikacji zestawu szablonów i nie wysyła go z powrotem do wątku.

+0

Używam T4 Toolbox, który generuje wiele plików i tym samym modyfikuje rozwiązanie. Nie jestem pewien, czy zadziała w MsBuild. Uruchamianie T4 tylko w czasie kompilacji nie jest dla mnie żadną opcją, chcę widzieć wyniki natychmiast, kiedy zapisuję plik T4. Ale możesz podać informacje na temat używania MsBuild dla innych, którzy znajdą to pytanie. Może być dla nich przydatne. – Athari

+1

Rozumiem - nie próbowaliśmy integrować dwóch - może to zrobić Oleg. Właśnie potwierdziłem, że niestandardowe narzędzie nie jest już wymagane dla msbuild, ale zamiast tego należy zmienić typ elementu w pliku csproj/vbproj z None/Compile na T4Transform lub T4Preprocess. Pliki wyjściowe przestaną być częścią twojego projektu. Istnieją metadane, które mogą przekierować je do pośredniego folderu obj lub gdzieś podobnego. – GarethJ

-1

Szablony T4 są wykonywane po zapisaniu pliku. Jeśli masz konfigurację VS do automatycznego zapisywania, gdy odsuniesz kartę od pliku, który może wyjaśnić zachowanie. Przejrzyj swoją konfigurację VS, aby ustalić, czy VS zapisuje plik, gdy znikniesz z karty.

+4

Pytanie brzmi, gdzie jest to ustawienie? – Athari

+3

-1 To jest niepoprawna informacja. Po przełączeniu kart szablon T4 jest wykonywany automatycznie, nawet jeśli zakładka nadal ma "*" w nazwie, wskazując, że plik nie został zapisany. – mellamokb

8

Miałem dokładnie ten sam problem. Wykonałem kroki opisane w tym artykule pod tytułem http://msdn.microsoft.com/en-us/library/ee789839.aspx dotyczące dzielenia szablonów na inny projekt i udostępniania plików wyjściowych.

To szczegóły, jak wyłączyć TextTemplatingFileGenerator narzędzia dołączonego do szablonu klikając prawym przyciskiem myszy szablon i wyczyszczenie CustomTool nieruchomości. Powoduje to zatrzymanie kodu generującego szablon po zapisaniu ... ale NADAL NAPRAWIA przy przełączaniu kart!

Myślę, że jedynym sposobem obejścia tego problemu byłoby przeniesienie całego kodu szablonu do nowego pliku z innym sufiksem (jak ttinclude lub t4 lub coś podobnego), a następnie dołączenie tego pliku do rzeczywistego pliku szablonu T4 przy użyciu zawierać dyrektywę. W ten sposób nigdy nie będziesz musiał otwierać tego pliku, aby edytować szablon, aby nie działał przez przypadek.

Tak w jednym pliku o nazwie MyTemplate.tt:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<#@ include file="Include\MyTemplateCodeBehind.t4" #> 
<#@ output extension=".vb"#> 
<# ' Nothing to see here! #> 

Podczas gdy w drugim pliku o nazwie MyTemplateCodeBehind.t4:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<# 
    For Each something In somecollection 
#> 
    <#= something.PrintMyCode() #> 
<# 
    Next 

#> 
1

Spróbuj zaraz po dyrektyw kompilacji dodać powrót do wyjść metody

<#@ template language="C#" debug="false" hostspecific="true"#> 
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
output extension="Repository.cs"#><# 
return string.Empty;  //<-- add this line!!! 

...

2

Co robię (chyba zły sposób) pisze na początku pliku tt linia wyjątek jak:

<# throw new Exception(); #> 

Bo wyjątek zatrzymanie procesu i kiedy zakończyć wszystkie prace I po prostu trzeba usunąć tę linię. :)