What a version number means
Versioning is something that I am very passionate about and have spent a long time trying to come up with an easy to use versioning system. From what you have already said in your question it is clear that you have understood one important point, the assembly version numbers are not synonymous with the product version. One is technically driven, and the other is driven by the business.
The following assumes that you use some form of source control and a build server. For context we use TeamCity and Subversion/GIT. TeamCity is free for a small (10) number of projects and is a very good build server but there are others, some of which are completely free.
What a version number means
What a version means to one person may mean something different to another, the general structure is major, minor, macro, micro. The way I look at a version number is to break it down into two parts. The first half describes the main version (Major) and any key updates (Minor). The second half indicates when it was built and what the source code version was. Version numbers also mean different things depending on the context, is it an API, Web App, etc.
Major.Minor.Build.Revision
RevisionThis is the number taken from source control to identify what was actually built.BuildThis is an ever increasing number that can be used to find a particular build on the build server. It is an important number because the build server may have built the same source twice with a different set of parameters. Using the build number in conjunction with the source number allows you to identify what was built and how.MinorThis should only change when there is a significant change to the public interface. For instance, if it is an API, would consuming code still be able to compile? This number should be reset to zero when the Major number changes.Majorindicates what version of the product you are on. For example the Major of all the VisualStudio 2008 assemblies is 9 and VisualStudio 2010 is 10.
The exception to the rule
There are always exceptions to the rule and you will have to adapt as you come across them. My original approach was based on using subversion but recently I have moved to GIT. Source control like subversion and source safe that use a central repository have a number that can be used to identify a particular set of sources from a given time. This is not the case for a distributed source control such as GIT. Because GIT uses distributed repositories that are on each development machine there is no auto incrementing number that you can use, there is a hack which uses the number of check-ins but it is ugly. Because of this I have had to evolve my approach.
Major.Minor.Macro.Build
The revision number has now gone, build has shifted to where the revision used to be and Macro has been inserted.
You can use the macro how you see fit but most of the time I leave it alone.
Because we use TeamCity the information lost from the revision number can be found in the build,
it does mean there is a two step process but we have not lost anything and is an acceptable compromise.
What to set
The first thing to understand is that the Assembly Version, File Version and Product Version do not have to match.
I am not advocating提倡 having different sets of numbers but it makes life a lot easier when making small changes to an assembly
that doesn't affect any public interfaces that you are not forced to recompile dependent assemblies.
The way I deal with this is to only set the Major and Minor numbers in the Assembly Version but to set all the values in the File Version.
For example:
- 1.2.0.0 (AssemblyVersion)
- 1.2.3.4 (FileVersion)
This gives you the ability to roll out hot fixes which will not break existing code because the assembly versions do not match
but allow you to see the revision/build of an assembly by looking at its file version number.
This is a common approach and can be seen on some open source assemblies when you look at the assembly details.
You as the Team lead would need to be responsible for incrementing the minor number when ever a breaking change is required.
One solution to rolling out a required change to an interface but not breaking previous code is to mark the current one as obsolete废弃 and creating a new interface.
It means that existing code is warned that the method is obsolete and could be removed at any time but doesn't require you to break everything immediately.
You can then remove the obsolete method when everything has been migrated迁移.
How to wire it together
You could do all the above manually but it would be very time consuming, the following is how we automate the process. Each step is runnable.
- Remove the
AssemblyVersionandAssemblyFileVersionattributes from all the project AssemblyInfo.cs files. - Create a common assembly info file (call it VersionInfo.cs) and add it as a linked item to all your projects.
- Add
AssemblyVersionandAssemblyFileVersionattributes to the version with values of "0.0.0.0". - Create an MsBuild project that builds your solution file.
- Add in a task prior to the build that updates the VersionInfo.cs. There are a number of open source MsBuild libraries that include an AssemblyInfo task which can set the version number. Just set it to an arbitrary number and test.
- Add a property group containing a property for each of the segments of the build number. This is where you set the major and minor. The build and revision number should be passed in as arguments.
With subversion:
<PropertyGroup>
<Version-Major>0</Version-Major>
<Version-Minor>0</Version-Minor>
<Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
<Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
<Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
<Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>
Hopefully I have been clear but there is a lot involved. Please ask any questions. I will use any feedback to put a more concise blog post together.
What a version number means的更多相关文章
- UnsupportedClassVersionError: Bad version number in .class file
java.lang.UnsupportedClassVersionError: Bad version number in .class file造成这种过错是ni的支撑Tomcat运行的JDK版本与 ...
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常
java.lang.UnsupportedClassVersionError: Bad version number in .class file异常 部署工程时也出现过因为版本不同引起的问题,那时我 ...
- Bad version number in .class file
TY项目是用JDK1.6做的,早先在电脑上装了一个1.5的,这回就不能用了.为了能用,我就又装了一个1.6的,修改了环境变量之后,以为一切OK.开始测试,首先在Myeclipse中打开我用1.5编的一 ...
- oracle.jbo.JboException: JBO-29000: JBO-29000: Bad version number in .class file
我在本地run Page的时候报以下错误. oracle.jbo.JboException: JBO-29000: JBO-29000: Bad version number in .class fi ...
- The CompilerVersion constant identifies the internal version number of the Delphi compiler.
http://delphi.wikia.com/wiki/CompilerVersion_Constant The CompilerVersion constant identifies the in ...
- Java Bad version number in .class file
错误信息: java.lang.UnsupportedClassVersionError: Bad version number in .class file at java.lang.ClassLo ...
- Java 异常 —— Bad version number in .class file
把一个项目拷贝到另一个环境,运行时报错: Caused by: java.lang.UnsupportedClassVersionError: Bad version number in .class ...
- UnsupportedClassVersionError: Bad version number in...
在使用eclipse开发servlet可能会出现一个很麻烦事情,版本不一致错误. java.lang.UnsupportedClassVersionError: Bad version number ...
- java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决办法
java.lang.UnsupportedClassVersionError: Bad version number in .class file 造成这种错误的原因是支撑Tomcat运行的JDK版本 ...
随机推荐
- 【BZOJ】【1046】【HAOI2007】上升序列
DP+贪心 啊……其实是个水题,想的复杂了 令f[i]表示以 i 为起始位置的最长上升子序列的长度,那么对于一个询问x,我们可以贪心地从前往后扫,如果f[i]>=x && a[i ...
- Delphi中@,^,#,$特殊符号意义
概述: ^: 指针 @: 取址 #: 十进制符 $: 十六进制符 @:取址运算符; var int:integer; p:^integer; begin new(P); ...
- ZOJ题目分类
ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...
- mysql之视图
视图 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询. 理解视图最好的办法就是来看一下例子: SELECT cust_name , cust_contact FRO ...
- Understanding node.js
Node.js has generally caused two reactions in people I've introduced it to. Basically people either ...
- 简单验证码识别 tessnet2
今天突然间对识别验证码感兴趣,于是网上搜了一下 最简单的是引用tessnet2.dll,然后通过它来识别,代码如下 private void button1_Click(object sender, ...
- C# Socket 入门4 UPD 发送结构体(转)
今天我们来学 socket 发送结构体 1. 先看要发送的结构体 using System; using System.Collections.Generic; using System.Text; ...
- lintcode:删除链表中指定元素
题目 删除链表中等于给定值val的所有节点. 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1-> ...
- 【转】SIP初步
1.什么是SIP SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用.会话(Session)指两方或多方用户之间的语音.视频.及其他媒体形式的通信,具体可能是IP电话.会议.即 ...
- Java-数据结构与算法-二分查找法
1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...