When changing a project’s build script over to Gulpjs, I ran into a problem with one step - creating an AssemblyInfo.cs
file.
My projects have their version number in the package.json
file, and I read that at compile time, pull in some information from the build server, and write that to an AssemblyVersion.cs
file. This file is not tracked by git, and I don’t want it showing up as a modification if you run the build script locally.
The problem is that the gulp-dotnet-assembly-info package doesn’t support generation of files, only updating. To get around this I used the gulp-rename package to read a template file, and generate the non-tracked AssemblyVersion.cs
file.
Steps
First, create an AssemblyVersion.base
file, and save it somewhere in your repository. I usually put it next to the gulpfile
, or in the projects Properties
directory, depending on if the project has multiple assemblies or not. This file can be added and tracked by git - it won’t get changed.
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("0.0.0")]
[assembly: AssemblyFileVersion("0.0.0")]
[assembly: AssemblyDescription("Build: 0, Commit Sha: 0")]
Next install the two gulp modules, and import into your gulpfile
:
npm install gulp-rename --save
npm install gulp-dotnet-assembly-info --save
var rename = require('gulp-rename');
var assemblyInfo = require('gulp-dotnet-assembly-info');
In the gulp file, read the package.json
file and the environment variables. I do this once at the begining of my gulpfile
and use the config all over the place.
var project = JSON.parse(fs.readFileSync("./package.json"));
var config = {
name: project.name,
version: project.version,
commit: process.env.APPVEYOR_REPO_COMMIT || "0",
buildNumber: process.env.APPVEYOR_BUILD_VERSION || "0",
}
Then add a task to create a new AssemblyVersion.cs
file. Change the src
parameter to match where you saved the AssemblyVersion.base
file.
gulp.task('version', function() {
return gulp
.src(config.name + '/Properties/AssemblyVersion.base')
.pipe(rename("AssemblyVersion.cs"))
.pipe(assemblyInfo({
version: config.version,
fileVersion: config.version,
description: "Build: " + config.buildNumber + ", Sha: " + config.commit
}))
.pipe(gulp.dest('./' + config.name + '/Properties'));
});
Don’t forget to reference the AssemblyVersion.cs
file in your csproj!
You can see a full gulpfile
with this in here: Magistrate gulpfile.