利用SVN版本信息更新application版本信息的意义
在我们采用SVN进行代码管理的时候,SVN会为我们每次更新的代码设置一个版本号,如图所示。如果我们下载这个版本的代码,并且能够在编译这个代码所产生的exe或dll的属性中写入这份代码所对应的SVN版本号,则我们就可以知道我们的exe和dll是SVN上哪个版本的代码编译出来的了。这是很有用的,比如我们将编译出的exe交给公司代码管理的负责人,然后测试人员下载exe进行测试,当测出问题的时候,测试人员可以提供exe中对应的SVN版本号,这样我们可以直接定位到相应的代码,甚至我们可以将svn中上一个版本进行编译,让测试人员测试是否存在同样的问题,从而迅速定位bug的来源。
那接下来我就讲述一下如何实现利用SVN版本信息更新application版本信息。大略的过程是,利用SubWCRev.exe文件将SVN中的版本信息替换到头文件中的宏,从而更新程序rc资源中的版本信息。
首先说明C++工程
Step1:创建模板文件和头文件。
头文件这里命名为svn_version.h,里面定义一些宏包括SVN_REVISION(版本号),SVN_TIME_NOW(编译时间)等,这些宏最后会给资源赋值。模板文件这里命名为svn_version.h.tmpl,里面定义同样的宏,并将宏赋值为SVN中的宏包括$WCREV$, $WCNOW$等,这样通过SubWCRev.exe就可以将SVN中的版本信息替换到模板中的宏,也就更新了头文件svn_version.h中的宏。注意模板文件必须是.tmpl后缀的。
Step2: 包装头文件svn_version.h
可以根据自己的需要将svn_version.h进行进一步的包装,因为最终你想显示在exe属性中的版本信息可能是需要加工的,比如下图中的version.h就是对svn_version.h的一次包装,但是这个步骤是可以省略的如果你不需要包装。
Step3: 创建资源文件SVNVersionManagerDemo.rc
在资源文件中使用version.h(如果没有包装svn_version.h就使用svn_version.h)中定义的宏,从而实现exe版本信息和svn版本信息的关联。添加资源的方法就是右键工程->Add->New Item->选择rc文件,然后双击rc文件,在Resource View中右键SVNVersionManagerDemo.rc->Add Resource->选择Version,右键Solution Explorer中的SVNVersionManagerDemo.rc文件,选择View code。在这里包含version.h头文件,然后采用version.h中的宏为rc中的version资源赋值。注意下图中红框标出的宏在version.h中是可以找到的。
Step4: 至此一切都准备就绪,只要能在每次编译的时候把SVN中的信息替换到头文件中就行了,所以可以在工程配置中的Pre-Build Event中加入命令行“SubWCRev $(SolutionDir) $(ProjectDir)svn_version.h.tmpl $(ProjectDir)svn_version.h -f”,这样在Pre-Build过程中SubWCRev.exe就可以吧SVN中的信息复制到svn_version.h中。
如上步骤完成后编译程序,右键查看生成exe或dll的详细属性可以发现其中的版本号等信息是随着SVN中Revison的变化而变化的。
C#工程中的配置方法
C#工程中的配置方法与C++中的配置方法的原理完全相同,配置过程有一点点区别,配置过程简单描述如下。
C#中的版本信息头文件为AssemblyInfo.cs等价于C++中的svn_version.h,我们要在C#工程中创建一个AssemblyInfo.cs.tmpl文件,然后将要替换的部分替换成SVN中的宏($WCREV$, $WCNOW$等),然后再在Pre-Build中加入命令“SubWCRev $(SolutionDir) $(ProjectDir)AssemblyInfo.cs.tmpl $(ProjectDir)AssemblyInfo.cs -f”。
最后在编译的过程中有些人会遇到如下图所示的错误,解决方案可以参考这个回答:
http://zhidao.baidu.com/link?url=SDrsIZkiRZQi1at2YYGJ4FOurXEFGj5kOyXH2DVpiJ1drX3OWvQNXAo27wx0hmMw-j4uVQdc54DMbsbh-rSLq_