项目模板参数化(上)
如果我们希望之前的那个项目模板更加实用,比如代码加个版权信息,包括创建时指定的项目名称,创建时间。该怎么办呢?实际上,Visual Studio的项目模板就有这样的一种机制,我个人把它定义为“参数化”机制。
让我们先看一个图,很简单
可以看到,我这里定义的“参数化”是指一个动态的过程,包括项目模板的准备阶段的“参数格式化”,和模板实例化时的附加动作“参数替换”。
参数格式化:在准备阶段(即制作“项目模板源”),我们可以在任意的源文件中,附加一些参数占位符,占位符的格式是 $参数名称$ ,参数名称是大小写敏感的,Visual Studio自己的模板机制只认识这种格式的参数。
参数替换:参数替换是参数化的执行阶段,也是这篇文章的重点,我总结了一下,Visual Studio 的模板有三种参数替换的方式,借助于这些方式,可以让模板的实例化成为现实。
方式一:系统保留的内置参数替换
Visual Studio有一些内置的参数可供我们使用,只要我们在源文件中定义的占位符参数和内置参数名称一致,IDE就会自动帮我们执行参数替换,下表是内置参数列表,摘自MSDN:
我们这里只做一个小实验,看看这些参数替换的结果,我们在之前的模板源里,添加一个BuildInParameterExperiment.txt文件,把这些内置的参数放在里面,让IDE帮我们执行替换,注意一点,这里需要把itemname,safeitemname,rootnamespace这三个排除掉,因为它们是用于项模板的。
同时,WebClient.vstemplate要用ProjectItem节点添加这个新的源文件,而且ReplaceParameters设置为true,告诉Visual Studio,我们要检索这个源文件中的参数,让Visual Studio帮助我们完成参数值的替换。
<ProjectItem ReplaceParameters="true">BuildInParameterExperiment.txt</ProjectItem>
这种方式的局限:即因为它是内置的,也只局限于一些最简单和通用的参数。
方式二:自定义参数以及传递
如果我们定义的参数不是内置的,我们该怎么传递值呢。Visual Studio模板提供了传递自定义参数值的功能。
首先,我们新建一个新的CustomParameterExperiment.txt文件,并且定义两个参数,这里的名字是自己选的:
DeveloperName = $DeveloperName$
ApplicationName = $ApplicationName$
好了,下面我们要做的事情是告诉Visual Studio这些参数的值,让Visual Studio在模板实例化阶段,能够用这些值将我们自定义参数替换掉。怎么做?很简单,将参数添加到TemplateContent节点下的CustomParameters集合下即可。
<CustomParameters>
<CustomParameter Name="$DeveloperName$" Value="Ethan Woo"/>
<CustomParameter Name="$ApplicationName$" Value="Two Layer Template Parameter Experiment Application"/>
</CustomParameters>
重新打包和部署,利用这个模板新建项目实例,看到结果:
这种方式的局限:很明显,就是参数值是写死了的,实际需求往往是需要和用户进行交互,捕捉到用户的输入,然后处理。能办到吗?答案是肯定的,必须相信微软!
为了增强易读性,将这个方式放到下一篇专门阐述。
摘自:http://www.ethan-woo.com/post/2011/05/02/VisualStudio-Template-Parameterization-First.aspx