在VS2005中创建项目模板来提高开发效率

 

在VS2005中创建项目模板来提高开发效率

我们身在何处?

通常情况下,我们会在一段时间内,使用同一种开发工具开发结构相近的项目,比如在VS2005中开发Web应用程序,数据访问使用iBATIS.NET。对于Web项目来说,它往往包含了js、css、image等文件夹和相应文件,还有经过配置的Global.asax、web.config文件,此外还有通用的用户管理、日志等内容;使用iBATIS时,则需要包含dao.config、sqlMap.config、providers.config等文件。我们可以在项目开始时将这些文件拷贝过去。这也许不是什么大问题,但毕竟还是不方便。

项目模板和项模板可给我们带来方便,为我们省却上面的烦恼。

结构

首先来看看VS2005中的模板结构。VS2005默认附带了一些项目模板,比如Windows 应用程序,类库,Web Site以及Web Service等。在新建一个Web Site项目时,会出现下面的窗体:

VS2005会选择下面目录中的模本:

C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/ProjectTemplates/Web/CSharp/1033

当然这个路径取决于VS2005的安装路径。

看看这个文件夹下的文件,会发现每个项目都对应于一个zip文件。zip文件里包含创建项目所需的文件,还包含了一个扩展名为vstemplate的文件,该文件包含了创建项目所需的信息,并以XML的格式存储了项目模板的元数据(Meta data)。

简单来说,创建模板需要创建vstemplate文件和zip文件包。但是,我们在何处存放zip文件呢?VS2005给了我们很大的自由,我们甚至可以存放在网络驱动器中,这对团队开发会大有裨益。那么如何配置呢?

1、在VS2005中,打开Tools->Options

2、展开Projects & Solutions

3、点击General

4、修改相应的项目模板或项模板位置,可以是网络启动器

经过上述配置后,团队中的开发人员可以共享一组项目模板。

创建项目模板

创建模板的过程相当简单。

1、创建一个预定义的模板

2、进行修改,比如添加页面、类等

3、保存项目

4、点击File->Export Template

5、跟随向导完成创建。

为演示该过程,我创建了一个名为templatearticle的网站。文件夹结构看起来如下:

然后点击File->Export Templates,导出模板的向导窗体出现:

此处可以选择模板类型,模板的源项目,模板项目所用的语言。

点击Next。

出现Select Template Options窗体:

设置模板名称和描述信息。可以选中“自动导入到Visual Studio”。

点击Finish完成。

创建项模板过程类似,只需在第一步时将模板类型选择为Item Template。

使用项目/项模板

通过上述步骤,我们已经成功创建了项目/项模板。下面来看一下如何使用它们。

1、通过项目模板创建项目

  • 点击File->New->Web Site.
  • New Web Site会出现

  • 在My Templates中,可以注意到有个名为Template Article的模板。
  • 在输入站点名称后,项目就得以创建。

从模板创建项

右击项目文件夹,选择Add New Item

Add New Item Window出现

可以看到Registration Class项模板。

输入名称,项得以创建。

至此,模板创建和使用的简单介绍就完成了。不过它的详细用法就要你去研究了 :)

 

 

基本上,我们每次在VS中新建一个项目(Project)或项(Item)的时候,都用到了它的模板。这些模板给我们提供了一个好的开始。如果你曾经历过从ASP.NET Web Application到AJAX Web Application的升级,就会对此有所体会;如果你是一个开源爱好者,需要在项目中应用大量的开源组件,那么每次的添加引用和配置也会让人厌烦。模板给我们节省了很多时间,并能使同类型的项目/项保持一致。

在VS中我们可以很方便地导出项目/项模板,可以参考下面两篇文章:

在VS2005中创建项目模板来提高开发效率

制作Visual Studio项目模板

本文将介绍模板的更多内容。

什么是项目/项模板

项目模板包含了创建特定类型的项目所需的必要文件(包括引用)。VS本身就提供了很多内置的项目模板,如Console Application, Class Library和ASP.NET Web Application等等。大部分项目模板基于一种特定的语言,如C#、F#等,同时针对特定的领域,如Windows、Web和Test等等,它们正是以此进行分类组织:

add-new-proj

这里,创建一个控制台应用程序,

create-a-console-application

基本的引用已经添加完毕,并且有了一个Program.cs文件,接下来就可以在Main函数编写代码了。

项模板用于创建逻辑上的单个文件(有时可能是创建了多个文件,比如Web Form模板,不过它们在逻辑上仍被看作单个文件)。这个过程就不再赘述了。

项目/项模板简析

现在该了解一下这些模板是如何实现的了。前面提到,VS内置了很多模板,那就看看它们是怎么做的。

先来看项目模板,内置的项目模板位于[VS2008 Path]/Common7/IDE/ProjectTemplates,这里可以看到几个以语言名称命名的文件夹,进入CSharp,则是Windows、Web、Test等文件夹,这是前面提到的模板组织方式。继续下去,打开Windows/1033文件夹,可以看多几个zip文件包。从文件名可以想到,VS当中看到的模板就是这里的一个zip包。

事实正是如此。解压缩ConsoleApplication.zip文件,这里有四个文件:

contents-of-console-template

.cs和.csproj文件就是创建项目后得到的文件,那vstemplate文件呢?它是模板的组织者,没有它,zip包就只是几个零散的文件而已。这个文件称为模板清单(Template Manifest),它实际上就是一个XML文件。

项模板的情况与此类似,它们位于[VS2008 Path]/Common7/IDE/ItemTemplates。

模板清单(Template Manifest)

清单文件是XML文件,它的Schema文件是[VS2008 Path]/XML/Schemas/1033/vstemplate.xsd,通过xsd文件我们可以了解清单文件的结构。

它的根节点是<VSTemplate>,该节点有两个Attribute:

  • Type:指定模板类型(项目模板还是项模板),取值可以是Project、ProjectGroup或Item;
  • Version:模板所用于的.NET Framework版本号。

该节点在Class文件的模板中是这样的:

<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
</VSTemplate>

<VSTemplate>节点可以有四种子节点:

  • <TemplateData>:必选项,包含了模板的基本信息,如名称、图标、默认名称等。
  • <TemplateContent>:必选项,指定了模板所包含的文件。
  • <WizardData>:可选项,包含了传给自定义向导的XML数据。
  • <WizardExtension>:可选项,包含了一些自定义模板向导的信息。

由于这些节点包含的信息比较多,这里只好偷懒了,它们在MSDN的链接分别是:

另外还可以看看Visual Studio Templates主页项目模板和项模板之间的区别

有了上面这些知识,就可以对清单文件有全面的认识了,下面来看看如何创建模板。

创建模板

项目模板和项模板的创建有所不同,但是都有两种方式:自动方式和手工方式。使用自动方式,跟随VS的向导创建模板,而使用手工方式,则需要编写一些代码,尤其是前面提到的清单文件。一般情况下,自动方式更为简单、快捷,而手工方式则更为强大和灵活。

手工方式创建模板

其过程包含三个步骤:

  • 创建模板所包含的文件;
  • 创建清单文件,编写代码对模板进行配置;
  • 部署。

首先创建一个类库项目,它的结构如下所示:

myclasslib-arch

接下来在MyClassLibTemplate.vstemplate文件内对模板进行配置:

XML Code - 第一个模板清单文件
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    
<TemplateData>
        
<Name>My ClassLib Template</Name>
        
<Description>A simple class library template</Description>
        
<ProjectType>CSharp</ProjectType>
        
<ProjectSubType></ProjectSubType>
        
<SortOrder>1000</SortOrder>
        
<CreateNewFolder>true</CreateNewFolder>
        
<DefaultName>MyClassLibProj</DefaultName>
        
<ProvideDefaultName>true</ProvideDefaultName>
        
<LocationField>Enabled</LocationField>
        
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
        
<Icon>ufo.ico</Icon>
    
</TemplateData>
    
<TemplateContent>
        
<Project TargetFileName="MyClassLib.csproj" File="MyClassLib.csproj"
                 ReplaceParameters
="true">
            
<ProjectItem TargetFileName="SampleClass.cs" ReplaceParameters="true" >
                SampleClass.cs
            
</ProjectItem>
            
<Folder Name="Properties" TargetFolderName="Properties">
                
<ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">
                    AssemblyInfo.cs
                
</ProjectItem>
            
</Folder>
        
</Project>
    </TemplateContent>
</VSTemplate>


最后是部署。将所有这些文件放在一起(如果有文件夹,要保持它的层次结构),打包为zip文件。将文件拷贝到下面两个路径之一:

  • 如果是项目模板,拷到[My Documents Path]/Visual Studio 2008/Templates/ProjectTemplates;
  • 如果是项模板,拷到[My Documents Path]/Visual Studio 2008/Templates/ItemTemplates。

由于刚才创建的模板是项目模板,所以放在第一个路径下。然后打开VS 2008,新建一个项目,在My Templates下可以看到我们自定义的模板:

add-a-custom-project

关于以自动(向导)方式创建模板,可以参考本文开头提到的两篇文章。

自定义模板

前面的例子很简单,甚至是过于简单了。在真实的开发中,可能需要向模板传递一些参数。

首先,需要在文件中插入占位符,如$Author$,Author就是参数的名称。看下面的例子:

C# Code - 设置模板参数占位符
namespace ClassLibrary1
{
    
// Company: $Company$
    
// Created By: $Author$
    public class SampleClass
    {
    }
}


接下来需要在模板清单文件中定义这些参数和它们的值,向<TemplateContent>节点中添加<CustomParameters>节点:

XML Code - 设置参数值
<CustomParameters>
    
<CustomParameter Name="$Company$" Value="my company" />
    
<CustomParameter Name="$Author$" Value="Anders Cui" />
</CustomParameters>


好了,现在重新部署这个模板,添加一个新项目,得到的文件是:

C# Code - 使用参数之后
namespace ClassLibrary1
{
    
// Company: my company
    
// Created By: Anders Cui
    public class SampleClass
    {
    }
}


需要注意的是,相关ProjectItem的ReplaceParameters特性值要为“true”。现在,如果模板中有10个文件用到了$Author$,就能节省不少时间了,不过我还是不满足,能不能在运行时获取用户的输入呢?看看下一节关于向导的内容。

自定义模板向导

VS模板的一个增强特性就是自定义向导,这些向导可以在用户由模板创建项目/项的时候运行。向导的好处在于可以:

  • 收集用户的输入信息;
  • 向模板添加参数值;
  • 向项目添加其它文件;

使用模板向导,可以访问DTE对象(Development Tools Extensibility,是Visual Studio自动化对象模型中的主对象),从而可以方便地操作项目。创建模板向导的基本步骤为:

  • 创建一个程序集,它要实现IWizard接口;
  • 将该程序集注册到GAC(Global Assembly Cache);
  • 更新模板清单文件,使用该程序集。

这里将继续使用上面的例子,不过这次要从用户界面收集参数值,而不是把它们放在模板清单中。

先来实现IWizard接口,该接口有6个方法,这些方法会在项目模板生命周期的特定时刻执行,其中的部分方法仅适用于项模板,它们的详情请参考:IWizard成员

当Visual Studio开始创建项目时,它立即调用RunStarted方法,因此该方法是收集用户输入信息的良好位置。它有四个参数:

  • Object 参数,可强制转换为根 _DTE 对象,以使您能够自定义项目。
  • Dictionary 参数,它包含模板中所有预定义参数的集合。
  • WizardRunKind 参数,它包含有关所使用的模板种类的信息。
  • Object 数组,它包含通过 Visual Studio 传递给向导的一组参数。

在本例中,将来自用户的输入添加到Dictionary参数中。好了,现在可以开始编码了,新建一个类库项目,名称为CustomTemplateWizard,新建一个Windows Form,用来接受用户输入,界面大体如下:

其代码为:


namespace CustomTemplateWizard
{
    
public partial class InputForm : Form
    {
        
private string company;
        
private string author;

        
public InputForm()
        {
            InitializeComponent();
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            company 
= txtCompany.Text;
            author 
= txtAuthor.Text;

            
this.Dispose();
        }

        
public string GetCompany()
        {
            
return company;
        }

        
public string GetAuthor()
        {
            
return author;
        }
    }
}


下面的类WizardImpl实现了IWizard接口:

C# Code - 实现IWizard接口的类WizardImpl


然后,编译项目,为项目添加强命名,接着注册到GAC(Global Assembly Cache)。

接下来要修改模板清单文件,来使用新出炉的程序集,这要在</TemplateContent>之后添加:


<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
    
<TemplateData>
        
<Name>MyClassLib</Name>
        
<Description>MyCustomClassLib</Description>
        
<ProjectType>CSharp</ProjectType>
        
<ProjectSubType>
        
</ProjectSubType>
        
<SortOrder>1000</SortOrder>
        
<CreateNewFolder>true</CreateNewFolder>
        
<DefaultName>MyClassLib</DefaultName>
        
<ProvideDefaultName>true</ProvideDefaultName>
        
<LocationField>Enabled</LocationField>
        
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
        
<Icon>__TemplateIcon.ico</Icon>
    
</TemplateData>
    
<TemplateContent>
        
<Project TargetFileName="MyClassLib.csproj" File="MyClassLib.csproj" ReplaceParameters="true">
            
<Folder Name="Properties" TargetFolderName="Properties">
                
<ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
            
</Folder>
            
<ProjectItem ReplaceParameters="true" TargetFileName="SampleClass.cs">SampleClass.cs</ProjectItem>
        
</Project>
    
</TemplateContent>
    
<WizardExtension>
        
<Assembly>
            CustomTemplateWizard, Version
=1.0.0.0, Culture=neutral, PublicKeyToken=294ee683ed83bb3d
        
</Assembly>
        
<FullClassName>CustomTemplateWizard.WizardImpl</FullClassName>
    
</WizardExtension>
</VSTemplate>


这些都完成后,跟前面一样,打包、部署,然后打开VS,新建一个项目,此时出现一个对话框,在这里输入信息:

info-collector2

点击确定,生成的文件中可以看到参数已被替换:

replacedfile

初学者工具包(Starter Kits)

初学者工具包是一种特殊的项目模板,用于与其他开发人员分享示例代码和代码资源,可以看作是加强版的项目模板。初学者工具包往往包含了项目模板的所有内容,还可能包含额外的文档内容。

 

到些为止,项目模板的创建已经完成。但是还有一点麻烦的是,每次我们要安装此模板时,需要手工将该压缩文件拷贝到项目模板目录,使用起来不是很方便。我们希望能像安装文件那样,双击即可完成安装,不需要手工拷贝文件。此时我们还需要一个文件,.vscontent,来制作.vsi安装文件。我们在刚刚导出的项目模板目录中新建名为:SampleProjectTemplate.vscontent的xml文件。它的内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2005">
    <Content>
        <FileName>SampleProjectTemplate.zip</FileName>
        <DisplayName>Sample Project Template</DisplayName>
        <Description>A project template created for this example.</Description>
        <FileContentType>VSTemplate</FileContentType>
        <ContentVersion>1.0</ContentVersion>
        <Attributes>
            <Attribute name="ProjectType" value="Visual C#"/>
            <Attribute name="ProjectSubType" value="Web"/>
            <Attribute name="TemplateType" value="Project"/>
        </Attributes>
    </Content>
</VSContent>

以上的属性配置就不多介绍了,需要说明的是ProjectSubType属性是指定将该模板安装在Web的项目列表当中。将项目模板的压缩文件和SampleProjectTemplate.vscontent压缩成一个ZIP文件,并且修改后缀名为:.vsi 。然后你可以看到的它的图标发生面什么变化了,双击该文件,我们会得到这样的一个安装向导界面:

Export Template 4

OK,这就是我们需要的一个项目模板安装文件,直接完成,就可以完成项目模板的安装和导入。

现在,你就可以开始动手创建自己的项目模板了,享受项目模板带来的便利了 :)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值