Saját item template készítése

Van egy aktuális webfejlesztési projektünk, ahol az egyes oldalakhoz tartozó közös funkcionalitás megvalósítása érdekében kénytelenek voltunk bizonyos szabályokat előírni, amelyeket az egyes ASPX oldalaknak követniük kell. Ezen túlmenően kialakítottunk egységes kódolási konvenciókat is, melyekhez az ASPX markup fájloknak és az ASPX.CS code behind fájloknak tartaniuk kell magukat. Mindezek együttesen azt eredményezték, hogy egy-egy oldal létrehozása után számos módosítást kötelezően el kell végezni a kód fájlban, melyek közül ha egyik-másik elmarad, elég nehézkesen derül ki tesztelésnél.

Ezért merült fel ötletként, hogy hozzunk létre egy új item template-et, amely a Visual Studio Add New Item ablakában megjelenve egy csapásra létrehozza a szükséges fájlokat, bennük a már módosított kóddal. Konkrétabban, a feladat egy ASPX és egy ASP.CS fájl létrehozása, továbbá az App_LocalResources mappában egy .ASPX.RESX és egy .ASPX.EN.RESX fájl létrehozása néhány kezdő értékkel.

Először is hozzunk létre egy olyan projekt típust, amelyhez item template-et szeretnénk készíteni – a mi esetünkben ez egy Web Site -, majd hozzuk létre benne a sablonizálni kívánt fájlokat.

Ezek után az első nehézséget az jelenti, hogy az ember nem találja a sablonizálásra szolgáló menüpontot a Visual Studioban. Pedig van, illetve nincs, szóval van is, meg nincs is. A File menüben lenne a helye, de nincs ott (pedig határozottan úgy emlékszem, hogy a bétában még ott volt). Ez ne zavarjon minket, nyissuk meg a ToolsOptions ablakot, majd a Commands fülről a File kategóriából keressük ki az Export Template… parancsot és rakjuk a helyére.

Az így elővarázsolt paranccsal indítsuk el az Export Template varázslót és értelemszerűen kövessük végig a lépéseit. A varázsló végeredménye egy ZIP fájl lesz, az az alábbi útvonalon: C:Users<TENEVED>DocumentsVisual Studio 2005My Exported Templates. Nagyon tetszett, hogy a varázsló készítői gondoltak arra, hogy egy item valójában több fájlból állhat, ugyanis a varázsló ezt állítja magáról:

All dependent files (including designer and resource files) will automatically be included with the selected item in the exported template.

A második nehézséget az jelenti, hogy sajnos ez így nem műküdik, konkrétan az ASPX oldalhoz tartozó resource fájlokat a varázsló nem tette magáévá. Pedig az ígéret szép szó! Ezt a problémát tehát kézzel kell megjavítanunk.

A varázsló által említett cél útvonal nagyon látványos, de a Visual Studio nem onnan dolgozik. Keressünk egy azonos nevű ZIP fájlt a következő mappában és nyissuk is meg a tartalmát: C:Users<TENEVED>DocumentsVisual Studio 2005TemplatesItemTemplates.

Keressünk benne egy .vstemplate kiterjesztésű állományt, másoljuk ki a ZIP-ből és nyissuk meg szövegszerkesztővel bátran, mert XML fájlról van szó. A <TemplateData> elemben láthatjuk a sablonhoz tartozó alap metaadatokat, ami viszont számunkra most fontosabb, az a <TemplateContent> elem, amely a sablonhoz tartozó fájlokat definiálja. Itt kellene megjelennie a resource fájljainknak.

Mivel a fájl elején van névtér hivatkozás, a Studio megpróbál IntelliSense-szel segíteni. A harmadik nehézséget az jelenti, hogy az IntelliSense nem jó, olyan elemeket kell felvennünk a fájlba, amit az IntelliSense nem ismer, konkrétan egy <Folder> tag-et jónéhány attribútummal. A hivatkozott mappát – nálunk App_LocalResources – a ZIP fájlon belül is létre kell hozni és a resource sablonokat azon belül kell tárolni, hogy a Studio majd onnan vegye ki.

A negyedik nehézséget az okozta, hogy természetesen minden alkalommal más nevet akarunk adni a létrehozandó fájlnak és ezzel együtt a létrehozandó osztálynak is. Ehhez használhatunk placeholder sztringeket, amelyekről találunk leírást az MSDN-ben. Például a $fileinputname$ az általunk megadott fájl nevet fogja jelenteni, a $safeitemname$ pedig az abból képzett olyan nevet, amit akár osztálynévként is használhatunk. Az XML fájlban a ReplaceParameters="true|false" attribútum megadásával kérhetjük a Studiot, hogy cserélgesse ki ezeket a placeholdereket.

Végül már csak egy ötödik nehézség maradt, ami már inkább szépséghiba: új item létrehozásakor a Studio megnyitotta az ASPX fájlt és az ASPX.EN.RESX fájlt szerkesztésre. Mivel legtöbb esetben nem éppen erre a kettőre van szükség, kicsit variálnunk kell rajta, amit természetesen az XML-ben tehetünk meg: az OpenInEditor="true|false" attribútummal.

Ténykedésünk eredményeként a módosított .vstemplate fájl lényegi része ez lett:

  <TemplateContent>
    <References />
    <ProjectItem TargetFileName="$fileinputname$.aspx" OpenInEditor="true" ReplaceParameters="true">MyPage.aspx</ProjectItem>
    <ProjectItem TargetFileName="$fileinputname$.aspx.cs" ReplaceParameters="true">MyPage.aspx.cs</ProjectItem>
    <Folder Name="App_LocalResources" TargetFolderName="App_LocalResources">
      <ProjectItem TargetFileName="$fileinputname$.aspx.resx" ReplaceParameters="true" OpenInEditor="false">MyPage.aspx.resx</ProjectItem>
      <ProjectItem TargetFileName="$fileinputname$.aspx.en.resx" ReplaceParameters="true" OpenInEditor="false">MyPage.aspx.en.resx</ProjectItem>
    </Folder>
  </TemplateContent>

Végezetül néhány tapasztalati tanács:

  1. Úgy vettem észre, hogy a VS hajlamos cache-elni a template-et, ezért a sablon módosítása esetén érdemes újraindítani a Visual Studiot.
  2. Bár az XML-ben és a Studioban nincs lehetőség a sablon verzionálására, használhatjuk a <Description> tag-et arra, hogy abban megadjunk egy verziószámot, ami VS-ben is meg fog jelenni.
  3. Célszerű backupot készíteni az elkészült sablonról, mert nagyon elbújik ebben a mappában. Így gépünk újratelepítése vagy új projekt tag bevonása esetén is kéznél lesz. Ha lehetjük, tegyük a projekt többi részével együtt source control alá.

 

Technorati tags: ,

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s