为Migrator.net制作一个可自动生成版本号的项目模板
目前我在项目中使用Migrator.net来做数据库的版本控制和版本迁徙,尽管在存储过程方面有一些不理想,但总的来说能胜任我目前的工作需要(您可以到这里获取到Migrator.net的最新版本和示例)。Migrator.net是根据一个带有自然数的Migration标记来确定各个版本的顺序的,这个自然数您可以把它当作一个版本号,尽管它们可以是不连续的。代码就像下面的样子。
[Migration(20091112104106)] public class _20091112104106_Table1 : Migration { … }
很显然如果我们手动输入这个自然数不但不方便,而且在多人开发时还有可能出现冲突。那么通过自定义一个项目模板来完成这个版本号码的预设定应该是个不错的选择。一个好消息是Migrator.net0.8.0里为我们提供了一个c#的ItemTemplate,坏消息则是这个模板居然有错误,不过反正也要改就用它改吧。您可以在Migrator.net的解压包里找到这个Migration.zip文件,解压后可以看到一个图标文件,一个015_AddPromotionCodes.cs,还有一个MyTemplate.vstemplate文件。首先打开这个cs文件,它就是生成一个Migration类的模板文件,里面有很多被$包括的模板参数。修改完错误后再加上我们预设的版本号,这个文件应该是下面的样子:
using System.Data; using Migrator.Framework; namespace $rootnamespace$ { [Migration($DateTime$)] public class _$DateTime$_$fileinputname$ : Migration { public override void Down() { // write down code here } public override void Up() { // write up code here } } }
细心的朋友可能已经发现$DateTime$并不是模板向导所默认识别的模板参数。没错,因为默认的模板参数中没有一个符合我的要求,我希望根据Item创建的时间生成一个yyyyMMddHHmmss格式的数字串来作为版本号,而默认模板参数中的$time$里的分隔符导致了它不能被使用。先把$DateTime$如何生效放到一边。我还希望创建Migration类文件时自动为我的文件添加一个_yyyyMMddHHmmss_的前缀,这样便于我在外部就能知道这个类文件的版本号码,因此我们需要修改一下MyTemplate.vstemplate文件,修改的部分应该是下面的样子:
<ProjectItem SubType="Code" TargetFileName="_$DateTime$_$fileinputname$.cs"
ReplaceParameters="true">015_AddPromotionCodes.cs</ProjectItem>
现在该来看看我们自定义的模板参数如何生效了。要实现自定义的模板参数,我们需要扩展一下项目生成向导。您可以阅读MSDN的示例,也可以跟着我来做。首先创建一个项目(例如:CustomWizard),添加对Microsoft.VisualStudio.TemplateWizardInterface 和 EnvDTE的引用。然后创建一个集成IWizard的类(例如:MyWizard),IWizard接口定义了一系列方法,这些方法将在项目被创建的不同时刻运行。而对于我们现在的需求,只需要完成RunStarted方法就可以了。RunStarted方法接受一个叫做replacementsDictionary的字典参数,vs在创建项目时就会根据这个字典将模板内的占位符替换为值。我们也只需要吧$DateTime$添加进去就可以了,现在我们的MyWizard.cs看起来应该是下面的样子:
到这里代码部分就完成了。接下来需要用强名称为我们的程序集签名,这样才能把它安装到全局程序集缓存(GAC)供VS引用。方法很简单,右键项目选择属性,在签名卡片里选中为程序据签名。然后选择新建一个强名称键值文件(看图)。
加不加密其实无所谓,一样生成一个也成;)。现在签名文件生成好了,你的程序集可以安装在全世界任何一台计算机里了,当然还是先装自己机器上吧。MSDN提供了好几种方法,我还是比较喜欢命令行的那个。进入VS2008的命令行用 gacutil 命令来安装,我假设CustomWizard.dll 是在D:\ 下,那我们的命令看起来应该是下面的样子:
> gacutil –i “d:\CustomWizard.dll”
接下来我们还需要获得引用这个程序集的字串,运行下面的命令会让我们得到这个串。
> gacutil –l CustomWizard
你会得到类似下面的一个字串,把它粘帖到记事本里一会会用到它。
CustomWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=56f6f841c4be4541, processorArchitecture=MSIL
好了,现在只要在需要使用这个自定义$DateTime$参数的模板里添加对上面自定义Wizard扩展的引用就可以了,还记得那个MyTemplate.vstemplate吧?打开它在VSTemplate配置节内添加下面的内容就可以了:
<WizardExtension> <Assembly> CustomWizard, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=56f6f841c4be4541,
processorArchitecture=MSIL
</Assembly> <FullClassName> CustomWizard.MyWizard </FullClassName> </WizardExtension>
ok,到现在这个可自动生成版本好的项目模板就做好了,同样的方法你可以广泛扩展并应用到项目中。
参考:C# Express and item template customization