How To: Update Assembly Version Numbers with MSBuild
UPDATE: For information on the "Y7K" or "2007" issue, see our new blog entry .
One of our most frequently asked questions is: "How do update my assembly version numbers at build time?". Unfortunately our answer has been "you can't". Until today, that is.
I just posted a new task, AssemblyInfoTask, at GotDotNet. It provides complete support for a wide variety of version number styles, from a fixed number to numbers that change daily to numbers that increment on every build. It also supports setting other properties such as AssemblyTitle, AssemblyCopyright, etc.
Even better, we've posted the complete source code, unit tests (that run in Visual Studio Team System), and raw documentation for the task under the new Microsoft Community License. Try not to laugh too hard when you look at the code. Remember, I don't write code for a living, I'm one of those touchy-feely Program Manager people :)
If all you want to do is get Visual Studio-style build numbers, of the form 1.0.yyMMdd.revision (for example, 1.0.51111.02 for the third build today), then you simply add the following line to your project file after any existing <Imports>:
<
Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.targets"/>
If anyone has trouble getting it to work, has comments, questions, or suggestions, please send 'em our way to msbuild@microsoft.com or post to our forum.Enjoy!
[ Author: Neil Enns ]
Comments
Anonymous
November 11, 2005
This is just what I needed. I was just about to write a custom task myself to set the version number and thought I would do a search just in case this common requirement was already done. Thanks!
P.S. I'll let you know if I find any bugs!
Phil Wright
Free VS2005 GUI Controls...
http://www.componentfactory.comAnonymous
November 11, 2005
Great! I was looking for something like this.
I quickly glanced at the code and I have a quick question about something I noticed: why did you create your own Version class when there is System.Version built into the BCL? Is it 'cause yours does something it doesn't?Anonymous
November 12, 2005
Good question, Jason. I must admit when I started with the task I didn't actually realize System.Version existed. At one point during the development I did try and switch to using the .NET Framework class.
The difference is in the property types. The .NET Version class stores everything as ints, and my class uses strings. This is to support leading numbers when doing custom formatting. For example, it's customary in Visual Studio-land for our revisions to be "01", "02", etc., rather than being "1", "2" and so on. If this gets stored as an int the custom formatting is lost. You can see this at work in the UpdateVersionProperty() method.
In hindsight I might be able to everything as ints in the Framework class and then do the formatting when I actually spit out the version number to the file. Perhaps in v1.1 :)
NeilAnonymous
November 12, 2005
Phil,
You also have to let me know if it works :)
NeilAnonymous
November 17, 2005
The comment has been removedAnonymous
November 29, 2005
If I have a .sln (converted to a msbuild-proj-xml file), how can I in one place set the version of every assembly?Anonymous
November 30, 2005
Steinar, I'm not sure what we're planning to do about that problem. I guess it's a year 2010 bug :)
NeilAnonymous
November 30, 2005
Bob,
Excellent question. You should be able to insert the necessary target call into your msbuild project XML file at the start of the build process. I don't have a converted file handy at the moment to mess with this (no VS2005 at home!). Can you shoot me mail at msbuild@microsoft.com to ask your question so I don't forget? That way I can look at it on Friday (tomorrow's swamped) and I'll get back to you in email as well as on the blog.
NeilAnonymous
December 07, 2005
<Import Project="$(MSBuildExtensionsPath)MicrosoftAssemblyInfoTaskMicrosoft.VersionNumber.targets"/>
This is working perfectly fine with the Projects having AssemblyInfo.cs file.
But how can I update the Version Numbers of the Assemblies generated by the <AspNetCompiler> task for a Website.
All the assemblies generated here show Version as 0.0.0.0
How can I generate the AssemblyInfo.cs file for the Website in advance.
I am using Visual Web Developer and do not have VS 2005.
Please suggest..
Thanks in advance
--ManishAnonymous
December 22, 2005
It's not a 2010, its a 2007 bug :)Anonymous
January 11, 2006
The comment has been removedAnonymous
January 30, 2006
The comment has been removedAnonymous
February 01, 2006
Actually the alt versioning system won't work because of leading zero issue.
Tobias.Anonymous
February 13, 2006
Hi, How can I use this on a Web Project ?
ThanksAnonymous
February 13, 2006
Hi
I was wondering if we had resolved the 2007 bug yet or not? (other than changing the formating of build version number)
JonAnonymous
March 07, 2006
How about changing the version number format to:
1.0.0.0
major.minor.patch.build_incrementAnonymous
April 11, 2006
The comment has been removedAnonymous
May 18, 2006
How to implement versioning for native VC++ projects that are part of a sln.Anonymous
June 02, 2006
I echo Leo's request: will this work on web projects?Anonymous
September 05, 2006
Does not work on mobile projects since ".NET Compact Framework" is differs from ".NET Framework" and System.Reflection namespace does not contain AssemblyFileVersion class.
Following error occurred:
=======================
Unable to update the AssemblyFileVersion for PropertiesAssemblyInfo.cs: No stub entry for AssemblyFileVersion was found in the AssemblyInfo file.
=======================
Please help!Anonymous
September 07, 2006
I need to charge the custom buiild number so that it contains my local time (Copenhagen) , can i use this to do it
thanksAnonymous
September 14, 2006
Won't work full stop with a project under Subversion control...
Unable to update the AssemblyFileVersion for _svntext-baseAssemblyInfo.cs.svn-base: No stub entry for AssemblyFileVersion was found in the AssemblyInfo file.
Shame :(Anonymous
September 21, 2006
I can't seem to find the source code on the Microsoft Community License page. Could you please post the link?Anonymous
September 27, 2006
PingBack from http://edgardorossetto.net/2006/05/06/como-incrementar-el-numero-de-version-de-los-assemblies-con-msbuild/Anonymous
October 24, 2006
The comment has been removedAnonymous
November 19, 2006
The comment has been removedAnonymous
December 05, 2006
I'm very proud of Visual Studio Team System and what Microsoft have done here - I've blogged about itAnonymous
December 11, 2006
I installed the downloaded file and created an C# project to test it. I found the following properties seems not work for me: <AssemblyMajorVersion>2</AssemblyMajorVersion> <AssemblyMinorVersion>0</AssemblyMinorVersion> <AssemblyFileMajorVersion>2</AssemblyFileMajorVersion> <AssemblyFileMinorVersion>0</AssemblyFileMinorVersion> I added these properties to the project file, after built it each time the Revision number getting increased and the major and minor numbers were keeping not changed, always "1.0". I am using VS 2005 + TFS. Can you point out what's wrong with my steps? Thanks, JonAnonymous
December 11, 2006
Ok, once I updated these properties in Microsoft.VersionNumber.targets, it works perfect. Thanks.Anonymous
December 23, 2006
Hi, I'm trying to get this to work along side with my SVN plugin for vs2005, but it seems that this wants to change the values of an AssemblyInfo.cs.svn-base file. This file is located inside a hidden directory called .svn Maybe an update for this could ignore files inside hidden folders.Anonymous
January 01, 2007
Just wondered if any one had come up with a workaround to the 2007 build number issue. I have just tried to build a project 1 Jan 2007 and it threw the error mentioned in the comments above.Anonymous
January 01, 2007
Same 2007 problem here... all of our nightly builds have failed. I hope we haven't followed Microsoft into a brick wall with their versioning standard.Anonymous
January 01, 2007
I have also come into the office this morning to find that the last two overnight builds have failed with the "2007 problem". Has anyone made any progress with this problem?Anonymous
January 02, 2007
Same '2007' problem with us as well.... Oops! We've changed our scripts to add the 4 'DateString' and 'MMdd' lines below. i.e. remove the YY part. It'll get us through the next few days. <PropertyGroup> <!-- Assembly version properties. Add others here --> <AssemblyMajorVersion>2</AssemblyMajorVersion> <AssemblyMinorVersion>1</AssemblyMinorVersion> <AssemblyFileMajorVersion>2</AssemblyFileMajorVersion> <AssemblyFileMinorVersion>1</AssemblyFileMinorVersion> <AssemblyBuildNumberType>DateString</AssemblyBuildNumberType> <AssemblyBuildNumberFormat>MMdd</AssemblyBuildNumberFormat> <AssemblyFileBuildNumberType>DateString</AssemblyFileBuildNumberType> <AssemblyFileBuildNumberFormat>MMdd</AssemblyFileBuildNumberFormat> <!-- TF.exe --> <TF>"$(TeamBuildRefPath)..tf.exe"</TF> <!-- AssemblyInfo file spec --> <AssemblyInfoSpec>AssemblyInfo.cs</AssemblyInfoSpec> </PropertyGroup>Anonymous
January 02, 2007
I implemented a new versioning scheme as described in http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1058284&SiteID=1. It keeps with the spirit of the version numbering scheme but it's far less convenient than yymmdd. This implementation sets the build number to the 2 digit year followed by the 3 digit day of the year. This scheme will work until 2065 :) To implement this, follow these steps:
- Get the AssemblyInfoTask source from http://www.gotdotnet.com/codegallery/releases/viewuploads.aspx?id=93d23e13-c653-4815-9e79-16107919f93e
- Open AssemblyInfoTask.cs and make the following changes: Go to the end of the file and add another entry to the IncrementMethod enum - I used DayOfYear = 3 Search for "Switch" in the file and add another case for the new increment method. Copy the DateString case but change the newVersionNumber to be: string newVersionNumber = DateTime.Now.Year.ToString().Substring(2) + String.Format("{0:000}",DateTime.Now.DayOfYear);
- Compile the app (remember it needs to be strong named if you want it in the GAC)
- Install the assembly into the GAC
- Open <program files>MSBuildMicrosoftAssemblyInfoTaskMicrosoft.VersionNumber.targets in Notepad - look for the task import (usingTask) and change the PublicKeyToken to match the one from your new assembly.
Anonymous
January 02, 2007
This seems like the best solution (much better than resetting the year to 1 which is an option I have seen suggested elsewhere). Are the (strongly named) binaries going to be reposted on GotDotNet?Anonymous
January 02, 2007
This seems like the best solution (much better than resetting the year to 1 which is an option I have seen suggested elsewhere). Are the (strongly named) binaries going to be reposted on GotDotNet?Anonymous
January 03, 2007
hehe, quite funny :) I'll be waiting for a new official update, I can work around with this 2007 problem for now.Anonymous
January 03, 2007
The comment has been removedAnonymous
February 25, 2007
can someone give me suggestions. i'm facing the following problem aseemblyinfo.cs file of main project is getting updated but not for the depended projects .these depended projects are defined in the .sln file of main project. sud i call this target "update assemblyinfo "for all depended projects separately or is there any other method??Anonymous
March 27, 2007
It seems that <AssemblyMajorVersion>1</AssemblyMajorVersion> <AssemblyMinorVersion>0</AssemblyMinorVersion> only work in the targets file, not in the project file. But this file is shared for all projects. How can I set these so they are specific to each project? Thanks DannyAnonymous
May 11, 2007
I'm going to stop writing new tasks for a couple of entries while I take some time to clean things up.Anonymous
May 20, 2007
Danny, You can copy the targets file to a local folder and import the local version instead of the one located in MSBuildExtensions. Then each solution or project use a corresponding local copy. ============== It seems that <AssemblyMajorVersion>1</AssemblyMajorVersion> <AssemblyMinorVersion>0</AssemblyMinorVersion> only work in the targets file, not in the project file. But this file is shared for all projects. How can I set these so they are specific to each project? Thanks DannyAnonymous
June 06, 2007
Hi, I'm using AssemblyInfoTask to update the Assembly info with MSBuild <Import Project="$(MSBuildExtensionsPath)MicrosoftAssemblyInfoTaskMicrosoft.VersionNumber.targets"/> My problem is that when it updates <Assembly: AssemblyCompany("The Company á")> it removes the character á. Any ideas on how I get AssemblyInfoTask to recognise accents etc...? ThanksAnonymous
August 12, 2007
Seems that godotnet does not exist anymore, but i cannot find the Task on CodePlex either. Where to get it?Anonymous
August 12, 2007
For those who can't find where to download it now like me, it's now aviable at http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=5C455590-332C-433B-A648-E368B9515580Anonymous
November 15, 2007
I'm really surprised no one has suggested using a year indicator with a Julian day of year instead of the month/day. This would save one digit and get us past this issue.Anonymous
November 21, 2007
Actully i need the same solution for .NET 2003 and i dont know how can i do that..??? Can any one help me.......??????Anonymous
November 30, 2007
There were over 80 responses to my recent post asking for feedback on where MSBuild should be headingAnonymous
December 08, 2007
Isn't it time ~somebody~ came up with a decent way to control version numbers associated with the build process???????? I have run into several different companies all ~home-brewing~ their own version incrementing scheme... let's get it together people... how long have version numbers been around now???Anonymous
February 19, 2008
When searching the URL http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=5C455590-332C-433B-A648-E368B9515580 , i received the message "The GotDotNet site has been shut down". I tried to search the new site, but was unable due to security restrictions at my enterprise. Please, could anyone post the new site for the URL above? Thanks.Anonymous
March 18, 2008
Hi, I'm facing a problem as described in http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2989436&SiteID=1 Could anyone help me solve that problem? Thanks.Anonymous
March 18, 2008
Ok. while YYDDD is convinient. i really dont want to download the source file and modify them. personal reasons and just want to see a clear yymmdd in there. instead i used major.minorYY.MMDD.Revisions since i manually input the minor revisions. might as well edit it yearly so i formated it in my project as minorYY sample 1.108.0319.05 major -1 minor -1 (with year 08) build - mmdd revision - auto incrementAnonymous
May 22, 2008
I'm also looking for the new URL (assuming this potentially useful task didn't go the same way as the GotDotNet site). Can anyone help?Anonymous
July 10, 2008
This seems to be the new URL: http://www.codeplex.com/tfsbuildversionsyncAnonymous
July 22, 2008
Hi, AssemblyInfoTask is not longer in the link you provided on GotDotNet. I found it anyways by searching internet from other sources. It will be great if you can update the link for other people to find it easier. Regards,Anonymous
July 22, 2008
The comment has been removedAnonymous
July 30, 2008
A lightweight alternative to versioning: http://freetodev.spaces.live.com/blog/cns!EC3C8F2028D842D5!547.entryAnonymous
October 26, 2008
Here's a more generic alternative that applies to C#, C++, etc. with MSBuild Community Tasks - http://code.dblock.org/ShowPost.aspx?id=19Anonymous
December 28, 2008
This questions has been asked twice already, and still no answer: Is there any way to apply this mechanism to a Web Project where no 'AssemblyInfo' and no .csproj / .vbproj files exist. There's a custom task approach described here: http://weblogs.asp.net/bradleyb/archive/2005/12/02/432150.aspx But it applies to WebDeployment Projects, which means that something needs to be done to the originally built dlls (app_web_xxxxxx.dll etc) since WebDeployment builds simply adds an 'asp_merge -copyattr' call to the original build of the Web Project.Anonymous
April 28, 2010
I had kind of similar issue. Here is the format I cooked Major.Minor.NNNNN.HHMM Where NNNNN is number of days from 1970 Jan 01 (Pseudo UNIX EPOC timestamp model) currently it is 14727 (on 04/28/2010) and to reach the max UInt16 (65534) we have 139 more years to go. HHMM => Current Hour and Min. with this model only the problem is, you will get the same version if you build within the same minute. Which is very unlikely to happen ;-) This is 'a' solution.Anonymous
August 16, 2012
any updates in 2012 ? where is full source code AssemblyInfoTask, ?