現在,我們來手工建立一個項目模板,並且研究一下部署和使用的問題。這裡我們還是用上一篇初始準備的那個模板源。
1,認識模板中繼資料檔案。
關於模板中繼資料檔案的格式,MSDN有詳細解釋,請參照這兩個連結:
Visual Studio Template Metadata Files:http://msdn.microsoft.com/en-us/library/xsxc3ete.aspx
Visual Studio Template Schema Reference :http://msdn.microsoft.com/en-us/library/xwkxbww4.aspx
模板的Schema還是很複雜的,所以,這裡只會對我們的例子中涉及的常用節點做一些介紹,順便提一下,模板中繼資料也有自己的XSD驗證檔案,預設位置如下:
C:\Program Files\Microsoft Visual Studio 10.0\xml\Schemas\1033\vstemplate.xsd
如果利用Visual Studio開啟這個XSD可以很直觀的看到它對中繼資料的格式要求進行了詳細的定義。
2,手工建立多項目模板的最佳實務之一。
首先,這裡我組織的樣本結構是最佳化後的方案,可以看作最佳實務之一,如所示。
我們用一個.sln檔案來組織並作為我們的專案檔,實際上項目模板的ZIP包是不需要.sln檔案的,這裡我用它來統一系統管理範本中的各個元素。當然我們這樣做也有一個不算缺點的小缺點,後面再說。
當然了,這裡看到的並不是實際的物理結構,物理檔案結構可以參考:
組織好這個邏輯結構後,剩下的就編寫.vstemplate檔案,用它來串聯項目模板內容的方方面面。
TwoLayerTemplate.vstemplate代碼:
<?xml version="1.0" encoding="utf-8"?>
<VSTemplate xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Version="3.0.0" Type="ProjectGroup">
<TemplateData>
<Name>Two Layer Web Application</Name>
<Description>Provide a two layer solution for web development</Description>
<ProjectType>CSharp</ProjectType>
<Icon>TwoLayerTemplateIcon.png</Icon>
<PreviewImage>TwoLayerTemplatePreview.png</PreviewImage>
<DefaultName>TwoLayerWebApp</DefaultName>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="WebClient">WebClient\WebClient.vstemplate</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="DataService">DataService\DataService.vstemplate</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
WebClient.vstemplate代碼:
<?xml version="1.0" encoding="utf-8"?>
<VSTemplate xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Version="3.0.0" Type="Project">
<TemplateData>
<Name>WebClient</Name>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<Project File="WebClient.csproj">
<ProjectItem>Properties\AssemblyInfo.cs</ProjectItem>
<ProjectItem>Default.aspx</ProjectItem>
<ProjectItem>Default.aspx.cs</ProjectItem>
<ProjectItem>Default.aspx.designer.cs</ProjectItem>
<ProjectItem>Web.config</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
DataService.vstemplate代碼:
<?xml version="1.0" encoding="utf-8"?>
<VSTemplate xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Version="3.0.0" Type="Project">
<TemplateData>
<Name>DataService</Name>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<Project File="DataService.csproj">
<ProjectItem>Properties\AssemblyInfo.cs</ProjectItem>
<ProjectItem>DataService.cs</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
每一個vstemplate中繼資料檔案都包含一個<VSTemplate>根節點以及<TemplateData>和<TemplateContent>兩個子節點。
1)VSTemplate根節點有兩個屬性:
Version屬性:用於指定模板的版本,根據MSDN參考,VS2010使用3.0.0;
Type屬性:用於指定模板的目標類型,常用三種值:Item,Project和ProjectGroup。其中Item表示項目範本,Project表示單項目模板,ProjectGroup表示多項目模板。
2)TemplateData節點用來組織模板本身的資訊,提供“建立項目”對話方塊中顯示的中繼資料,這些顯示的要點可以在上一篇的中看出來,其實這些內容大多和項目嚮導填寫資訊那一步做的事情差不多,不過這裡可以做到更多,比如說DefaultName屬性,指定以後可以作為建立項目對話方塊裡名稱的預設值出現,實際上預設顯示的是[DefaultName]+N格式,如:
3)TemplateContent主要節點用來組織模板源,說到這裡就不得不解釋一下"TwoLayerTemplate.vstemplate"和"WebClient.vstemplate","DataService.vstemplate"的關係了。
這裡,我個人定義一個新概念“根模板中繼資料檔案”,表示這個中繼資料結構比較特殊,它用來索引每個單獨的項目“模板中繼資料檔案”,我個人也給它一個新的概念“子模板中繼資料檔案”,這裡的"TwoLayerTemplate.vstemplate"就是這個根檔案,ProjectCollection作為TemplateContent的子節點,用來存放ProjectTemplateLink的集合,ProjectTemplateLink顧名思義,只是一個連結,連結到其他兩個子模板中繼資料檔案。多項目模板包含的實際子項目甚至可以是不同程式設計語言項目,但是整個多項目模板只能有一個總的類別,在根模板中繼資料檔案的TemplateData下的ProjectType屬性指定。
ProjectTemplateLink的屬性ProjectName要提一下,單項目模板的最終項目名稱是由“建立項目”對話方塊指定的,但是多項目模板的各個子項目,最終項目名稱不可能逐個指定,所以這裡直接用這個屬性指定了。
另外,對於其他兩個“子模板中繼資料檔案”,它們的TemplateContent節點下的配置方法是相同的,Project節點引用“模板源”裡的.csproj檔案,ProjectItem子節點用來索引這個項目裡援引的所有源檔案,唯一要注意的是要保證相對路徑都要正確。
至此,可以用下面的圖示來表示一下這個項目模板相關內容的一個邏輯結構。
這時,我們離概念上的項目模板還差一步,打包,其實很簡單,選中要打包的內容,發送到壓縮檔夾即可。這裡我將TwoLayerTemplate.sln檔案排除了,這就是我在第2步提到的那個“小缺點”,因為這個檔案對於項目模板來說不需要,當然,如果誤打到包裡面,也是能夠Working的。
3,部署和使用效果。
因為這裡的“多項目模板”中“根模板中繼資料檔案”定義的ProjectType是CSharp,所以我們部署的時候要放到如下目錄裡:
C:\Users\<CurrentUser>\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#
否則在“建立項目”對話方塊的類別裡表裡會找不到我們的模板,下面我們來看看效果:
可以查看命名空間檔案結構,來驗證模板的適用性。當然了,我們這裡舉的是很簡單的例子,適用的項目模板可能會很複雜,定製程度會更高。下一篇我們繼續探討。
摘自:http://www.ethan-woo.com/post/2011/04/24/First-VisualStudio-Template-Manually.aspx