VS2017 is officially out and with it, the new version of the .NET Core build system: MSBuild!

What? They’ve gone BACK? Yes. project.json was basically reimplementing everything already present in MSBuild so they changed back. Don’t worry, they upgraded MSBuild to be much lighter and less XML verbose. One of my test project has only 65 lines of XML and that includes some whitespace.

So migrating was a little bit of work since the migration tool works well for a vanilla project.json, but I had a few customizations for StyleCop and others. Here’s a quick recap of all the steps I had to go through and some caveats to keep in mind.

Migrate from project.json to csproj

After installing the .NET Core SDK 1.0.1, the first step is migrating to csproj.

First, I had to upgrade the sdk property of global.json, otherwise it couldn’t find the migrate command.

    "projects": [ "src", "test" ],
    "sdk": { "version": "1.1.1" }

Then, in the root folder of your solution:

dotnet migrate

This will take care of transforming all your project.json files to csproj. I had to delete my .sln file and create it anew in VS2017, but that might be my fault.

That’s the easy part! After that, a simple dotnet build worked.


I use StyleCop.Analyzers to lint my code and make sure everyone uses the same style. In each project.json, I had the following to link to shared settings in the root directory:

"buildOptions": {
    "debugType": "portable",
    "additionalArguments": [
    "warningsAsErrors": false

The migrate command did not take care of that. I had to open each csproj file and add the following:


    <AdditionalFiles Include="..\..\stylecop.json" />

Depending on when you migrate, you might have an issue where the JSON file is not loaded properly and StyleCop reports hundreds of errors.

The issue is resolved and waiting for merge here.

dotnet test and Shippable

I had to upgrade the three following dependencies from NuGet to their latest version.

  • Microsoft.NET.Test.Sdk: 15.0.0
  • xunit: 2.2.0
  • xunit.runner.visualstudio: 2.2.0

dotnet test does not have the same xUnit runner anymore. The test results are output in TRX format, which is not compatible with xUnit or jUnit by default.

I had to hunt the Internet for an XSLT file that transformed TRX to jUnit format so Shippable could understand the test results. Here is the result on GitHub Gist.


A few changes were needed to shippable.yml for everything to work. You can see my original post explaining the basics of Shippable.

language: none

    image_name: microsoft/dotnet
    image_tag: 1.1.1-sdk # Changed from 1.1.0-sdk-projectjson
    pull: true
    options: "-e HOME=/root"

    - apt-get --assume-yes install xsltproc
    # Removed the sed to treat warnings as errors
    - dotnet restore
     # Re-enable this when StyleCop.Analyzers is updated with the fix.
    - dotnet build # /p:TreatWarningsAsErrors=true
    - cd test/Akinox.Backend.Test.Unit
    # Changed this to output TRX format
    - dotnet test --logger "trx;LogFileName=../../../output.xml"

    - cd ../..
    # Uses new XLST file.
    - xsltproc -o shippable/testresults/result.xml scripts/trx-to-junit.xslt output.xml

    - cd ../..
    # Uses new XLST file.
    - xsltproc -o shippable/testresults/result.xml scripts/trx-to-junit.xslt output.xml


And with that, I’m at the same point I was before, except in VS2017. Now on to trying to load the solution with VS For Mac!

If you’ve migrated and had problems, please mention them in the comments!

A few links I found useful while going through the migration.