The problem: I have a DotNet Core package that I would like to build and publish to an internal NuGet feed using Visual Studio Team Services. If I was using a .nuspec or .csproj file, I could set the version number of the package during the build, but DotNet Core doesn’t let me do this.
The solution: Write a very small PowerShell script that will update project.json with a new version number, then plug that into the build.
param( [string]$path, [string]$version ) $project = Get-Content $path | ConvertFrom-Json $project.version = $version ConvertTo-Json -InputObject $project -Depth 32 | Out-File $path
So, what’s going on here? Not a lot: we’re reading project.json into an object, then modifying the version property (if you do this from command-line, you even get intellisense for project.json!), and then finally re-serializing the object to over-write the original file.
Annoyingly, this will screw up the formatting of project.json, but you don’t actually care about this because this file will only live for the duration of the build, and will never get back into source control.
Plugging it into VSTS
I’ve added a build variable to store the desired version number:
Package.Version = 1.0.$(Build.BuildId)-*
Then I’ve added a new PowerShell build step into the build as the first step. I’ve saved my file as Set-DotNetVersion.ps1, so we set up the following arguments:
That’s it! If you then call dotnet pack on your library, it’ll create a NuGet package with the version number that you specified above. My full build pipeline is:
- PowerShell Script
- Dotnet restore
- Dotnet pack
- Publish build artifacts