[Ww.VS] Szablony tekstowe w VS2008

Od chwili pojawienia się DSL Tools dla Visual Studio, dostępne były szablony tekstowe T4. Pisał o nich Arek w drugim Zine. Wraz z Visual Studio 2008, bez instalowania SDK czy DSL Tools, szablony T4 są dostepne "z pudełka". Zreszta ostatni wpis na blogu Arka (ten w ktorym używa takich skomplikowanych zwrotów jak refaktoryzacja czy metoda zwrotna kojarząca mi się z kolejami).

Jak najszybciej użyć T4?

Poprostu należy dodać plik o rozszerzeniu tt do projektu i VS2008 automatycznie podłączy CustomTool "TextTemplatingFileGenerator" i wygeneruje podłączony plik cs.

Wystarczy teraz w pliku napisać cos takiego:

namespace MyApp {
  class Class1 {
<# foreach (string name in new string[] { "Aaa", "Bbb", "Ccc" }) { #>
   string <#= name #> { get; set; }
<# } #>
  }
}

Aby otrzymać taki wynik:

namespace MyApp {
  class Class1 {
   string Aaa { get; set; }
   string Bbb { get; set; }
   string Ccc { get; set; }
  }
}

Parę uwag przy dodawaniu szablonów T4

  1. Za pierwszym razem możemy dostać ostrzerzenie "Security Warning" informujące o niebezpieczeństwie zniszczenia komputera pewnie razem z księżycem. Najlepiej potwierdzić za pomocą OK, zaznaczając wczesniej CheckBox "Do not show this message again".
  2. Plik tekstowy bez dyrektyw szablonu (znaczników na początku pliku <#@ i #>) czy znaczników renderowania, również jest poprawnym szablonem, który generuje tekst identyczny z zawartościa szablonu
  3. Wygodnie jest dodac nowy szablon za pomocą opcji "Add>New Item...", wybrać dowolny tekstowy plik jak Class czy Code File zmieniając rozszerzenie pliku na ".tt" zamiast ".cs"
  4. Standardowo plik generowany pod szablonem ma rozszerzenie ".cs" (to w przypadku projektów C#, zapewne w przypadku projektów VB będzie to ".vb" - nie sprawdzałem). Wiąże się to również z tym że zachowanie pliku w projekcie będzie takie jak typowego pliku o tym rozszerzeniu - w przypadku plików ".cs" "Build Action" będzie ustawiony na "Compile".
  5. Jesli wybierzemy inny plik (na przykład XML File), to standardowo dostaniemy wygenerowany plik ".cs". Generowane rozszerzenie można zmienić dodając dyrektywę output na przykład tak: <#@ output extension="xml" #> - koniecznie na początku pliku!
  6. Jesli plik szablonu o rozszerzeniu ".tt" skopiowany do schowka (na przykład z pulpitu, czy Exploratora Windows) wkleimy do projektu, to również poprawnie zarejestruje nam sie szablon.
  7. Jesli istniejącemu plikowi (na przykład ".cs") zmienimy rozszerzenie na ".tt", to znowu otrzymamy działający plik szablonu. Jedyna niedogodnościa może być to że wygenerowany plik pod szablonem będzie miał w nazwie suffix "1" (lub inna cyfrę). Można tego uniknąć stosując inną metodę, lub ręcznie edytując plik projektu ".csproj" (Unload Project a potem Edit) i usuwając element "LastGenOutput" z elementu odpowiadającego szablonowi. Po ponownym załadowaniu należy usunąć poprzednio wgenerowany plik i wymusić generację ponownie (opcja Run Custom Tool).

Mały bonus

W archiwum ZIP, znajdują się 4 pliki szablonów. Wystarczy je rozpakować, skopiować i wkleić do projektu, aby otrzymać parę klas "utilsowych".

Guard i GuardDebug - to klasy podobne do Assert, lecz posiadające API bazujące na xUnit.

Entries - to zbiór prostych klas-pojemników, do zastosowań wewnątrz implementacyjnych (nie zalecane "wystawianie" tych typów w publicznym API).

Przykładowe użycie:

Guard.NotNull(param1, "Param1 cannot be null.");
GuardDebug.NotNullOrEmpty(name, "Entity name cannot be empty.");
var e = new Entry<int, int, int>(1, 2, 3);
Guard.InRange(e.Value2, e.Value1, e.Value3, "Entry constraint not satisfied.");
var map = new Dictionary<string, Entry<string, int, int>>();

Jeśli macie jakieś uwagi zapraszam do komentowania lub kontaktu mailowego.

Oczywiscie standardowy disclaimer ze nei odpowiadam za problemy, wybuchy etc.

Opublikowane 21 lipca 08 09:43 przez Wojciech Gebczyk

Komentarze:

# jakubin said on lipca 21, 2008 23:40:

Ciekawy post. Od jakiegoś czasu zbierałem się, żeby poczytać właśnie o T4, tylko ciągle nie miałem czasu... A tu samo przyszło takie miłe wprowadzenie :).

# mgrzeg said on lipca 22, 2008 11:10:

Wojtek, jak zwykle swietny tekst!

MS przerzucil t4 z sdk do pudelka z VS (od wersji standard w gore), ale zapomnial o kolorowaniu skladni / intellisense do tt \ osadzonego c# / vb. Taki niby drobiazg, a juz trzeba siegac po rozwiazania firm trzecich: www.t4editor.net... ech!

# Ww.CodeSculptor said on września 8, 2008 14:08:

Przegladajac poranna dawke postow na blogach (nieodlaczny Google Reader), natknalem sie na ciekawy i

Komentarze anonimowe wyłączone

About Wojciech Gebczyk

Code Sculptor.