現在,我們來手工建立一個項目模闆,并且研究一下部署和使用的問題。這裡我們還是用上一篇初始準備的那個模闆源。
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
轉載于:https://www.cnblogs.com/hurenwang/archive/2011/12/15/2289002.html