第一个Visual Studio项目模板(手工创建)
现在,我们来手工创建一个项目模板,并且研究一下部署和使用的问题。这里我们还是用上一篇初始准备的那个模板源。
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