【发布软件】Visual Studio工具:自动递增版本号

来源:互联网 发布:怎样利用网络赚钱 编辑:程序博客网 时间:2024/05/22 11:53

前言

VS项目的版本号由四位数字组成,a.b.c.d。风格有两种:

  1. 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ] ] 
  2. 主版本号.  子版本号 [  编译版本号 [. 修正版本号 ] ]

编译版本号在源代码编译时递增。

我采用的是第二种版本号风格,想要VS编译时自动递增这个号。于是我编写了IncBuildNo来完成这个任务。


IncBuildNo是个命令行工具,与VS配合即可完成递增版本号的任务。如果你采用第一种版本号风格,IncBuildNo也能很好地胜任。IncBuildNo甚至可以干别的递增数字的工作,不仅仅是版本号,因为运行它时需要的参数之一是正则表达式。


安装与运行

  1. 复制IncBuildNo.exe到你的硬盘,例如C:\windows\IncBuildNo.exe
  2. 在Visual Studio中打开任意一个项目或解决方案, 在菜单上选择 项目 - >XXX属性- >生成事件
  3. 在后期生成事件命令行中输入命令: IncBuildNo.exe "$(PROJECTDIR)\Properties\AssemblyInfo.cs" "\[assembly: AssemblyVersion\(\"\d+\.\d+\.\d+\.(\d+)" 1
  4. 运行后期生成事件 选择 当生成更新项目输出时

按F6编译此项目,假如原来版本号是1.2.3.4,它会递增为1.2.3.5

如果你跟我一样,采用第二种版本号风格,命令就是

[plain] view plaincopyprint?
  1. IncBuildNo "$(ProjectDir)Properties\AssemblyInfo.cs" "\[assembly: AssemblyVersion\(\"\d+\.\d+\.(\d+)" 1  

下载

http://incrbuildnum.codeplex.com/releases/view/79528

技术支持截至2012年6月28日。

文档

更多参数设定请参考http://incrbuildnum.codeplex.com/documentation

FAQ

问1:如果一个解决方案包含多个项目,我修改了其中一个项目,其他的项目的版本号会递增吗?

答:设置好了就不会。(如何设置好请看问2)


问2:我的解决方案里只有一个项目,第一次编译后,我没有修改它,再按F6编译,此时版本号会递增吗?

答:会。但这不合逻辑,因为你没有修改项目,不应该重新编译,不应该启动IncBuildNo来递增版本号。但是如果不使用IncBuildNo,VS却不会重新编译。

原因在于IncBuildNo修改了AssemblyInfo.cs,后者是项目的一部分。所以,你可以把AssemblyInfo.cs排除在项目之外。这样,IncBuildNo仍然会递增AssemblyInfo.cs里的版本号,重复编译也不会重复递增了。

当你要发布发行版时,可以把AssemblyInfo.cs包括进项目,清除后期生成事件命令行,这样就把版本号编译进程序集里了。


问3:按照问2的回答,每次发布发行版都要清除后期生成事件命令行,太麻烦了,能不能简单点?

答:IncBuildNo有两个参数用来指定递增条件。你可以设置为DEBUG编译时递增,而RELEASE编译时不递增。详情见文档。

已知问题

  • 此问题不是本程序的问题,而是采用FAQ问2的做法产生的问题:当你在VS2010里新建WPF自定义控件(CustomControl),VS会提示你“值不在预期的范围内”,但CustomControl1.cs却创建好了。如果你继续工作,运行后会发现CustomControl1没有应用上模板,显示的是空白一片。这是因为没有将AssemblyInfo.cs包括在项目内的缘故。更重要的是,没有

[csharp] view plaincopyprint?
  1. [assembly: ThemeInfo(  
  2.     ResourceDictionaryLocation.None, //主题特定资源词典所处位置  
  3.     //(在页面或应用程序资源词典中   
  4.     // 未找到某个资源的情况下使用)  
  5.     ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置  
  6.     //(在页面、应用程序或任何主题特定资源词典中  
  7.     // 未找到某个资源的情况下使用)  
  8. )]  

。(你应该能在项目外的AssemblyInfo.cs中找到它。)没有这句话,所以CustomControl1不正常。如果你不想把AssemblyInfo.cs再包括进来,引起FAQ问2的情况,可以把上述代码复制到任何一个命名空间上面。如

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Windows;  
  3.   
  4. [assembly: ThemeInfo(  
  5.     ResourceDictionaryLocation.None, //主题特定资源词典所处位置  
  6.     //(在页面或应用程序资源词典中   
  7.     // 未找到某个资源的情况下使用)  
  8.     ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置  
  9.     //(在页面、应用程序或任何主题特定资源词典中  
  10.     // 未找到某个资源的情况下使用)  
  11. )]  
  12. namespace SgsInterface  
  13. {  
  14.     class Program  
  15.     {  
  16.         [STAThread]  
  17.         public static void Main(string[] args)  
  18.         {  
转自:http://blog.csdn.net/gqqnb/article/details/7213611
原创粉丝点击