你可以在Visual Studio中使用T4模板机制从一个简单的文本文件中生成所需的源代码:
I wanted to configure version information generation for some .NET
projects. It’s been a long time since I investigated available
options, so I searched around hoping to find some simple way of doing
this. What I’ve found didn’t look very encouraging: people write
Visual Studio add-ins and custom MsBuild tasks just to obtain one
integer number (okay, maybe two). This felt overkill for a small
personal project.
The inspiration came from one of the StackOverflow discussions where
somebody suggested that T4 templates could do the job. And of course
they can. The solution requires a minimal effort and no Visual Studio
or build process customization. Here what should be done:
Create a file with extension ".tt" and place there T4 template that will generate AssemblyVersion and AssemblyFileVersion attributes:
<#@ template language="C#" #>
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>
You will have to decide about version number generation algorithm. For
me it was sufficient to auto-generate a revision number that is set to
the number of days since January 1st, 2010. As you can see, the
version generation rule is written in plain C#, so you can easily
adjust it to your needs.
The file above should be placed in one of the projects. I created a new project with just this single file to make version management
technique clear. When I build this project (actually I don’t even need
to build it: saving the file is enough to trigger a Visual Studio
action), the following C# is generated:
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("1.0.1.113")]
[assembly: AssemblyFileVersion("1.0.1.113")]
Yes, today it’s 113 days since January 1st, 2010. Tomorrow the
revision number will change.
Next step is to remove AssemblyVersion and AssemblyFileVersion attributes from AssemblyInfo.cs files in all projects that should
share the same auto-generated version information. Instead choose “Add
existing item” for each projects, navigate to the folder with T4
template file, select corresponding “.cs” file and add it as a link.
That will do!
What I like about this approach is that it is lightweight (no custom
MsBuild tasks), and auto-generated version information is not added to
source control. And of course using C# for version generation
algorithm opens for algorithms of any complexity.