Configuring your C# project for semver
27 Dec 2015A while ago I got tired of manually configuring my C# projects to allow for easy semantic versioning and decided to automate the steps involved.
I created a small Node.js command line tool which does following things:
- Creates a text file (default:
version.txt
) in the project folder which contains the version number (default:0.1.0
). - Copies a
BuildCommon.targets
file to{project-root}/build/BuildCommon.targets
which is used to extend the build/clean process. - Adds a reference to the
BuildCommon.targets
file in the project file. - Comments out existing version related attributes in
AssemblyInfo.cs
.
I can then change the version number in version.txt
to 1.0.0-rc1
, 1.0.0
etc., build the project, and the assembly will have the correct version set.
Extending the build process
The build process is extended by overriding the CompileDependsOn
property and injecting the custom task before the original property.
The UpdateVersion
task creates AssemblyVersion.cs
in the intermediate output path ($(IntermediateOutputPath)
) and adds the version related attributes to it. The values are read from the text file created in step 1 above.
<PropertyGroup>
<CompileDependsOn>
UpdateVersion;
$(CompileDependsOn);
</CompileDependsOn>
</PropertyGroup>
The created file is also added to the build process.
<Compile Include="$(IntermediateOutputPath)AssemblyVersion.cs" />
Extending the clean process
MSBuild maintains a list of the files that should be removed when cleaning the project, in the item list FileWrites
.
<FileWrites Include="$(IntermediateOutputPath)AssemblyVersion.cs"/>