Recently I was building a sample application and noticed a build warning that I was using a preview version of the .NET Core SDK.
You can see from the screen show that the build shows zero warning and zero errors, but if you read the full build text you will notice the following message.
NETSDK1057: You are working with a preview version of the .NET Core SDK. You can define the SDK version via a global.json file in the current project. More at https://go.microsoft.com/fwlink/?linkid=869452 [C:\sdkTest\sdkTest.csproj]
That will teach me not to just look at the ending results of a build. I didn’t explicitly install the preview version I have been accidentally using, but I’m pretty sure it got installed with the Visual Studio Preview I have installed.
Setting the SDK version for a project
Following the link in the message from above will take you to the docs page for global.json which will allow you to specify what version of the SDK you want to use. Using the following command will give you a list of the SDK versions you have installed.
dotnet --list-sdks
On my machine, I have the following 5 SDKs installed.
2.1.201 [C:\Program Files\dotnet\sdk] 2.1.202 [C:\Program Files\dotnet\sdk] 2.1.302 [C:\Program Files\dotnet\sdk] 2.1.400-preview-009063 [C:\Program Files\dotnet\sdk] 2.1.400-preview-009171 [C:\Program Files\dotnet\sdk]
For this project, I really want to use version 2.1.302 which is the newest non-preview version. Using the following .NET CLI command will create a global.json file targeting the version we want.
dotnet new globaljson --sdk-version 2.1.302
If you open the new global.json file you will see the following which has the SDK version set to the value we specified. If you use the above command without specifying a version it will use the latest version installed on your machine, including preview versions.
{ "sdk": { "version": "2.1.302" } }
Now if you run the build command you will see that the warning is gone.
global.json Location
So far we have been using global.json from within a project directory, but that isn’t the only option for its location. For example, if I moved the global.json from the C:\sdkTest directory to C:\ then any .NET Core base application on the C drive would use the version specified in that top-level global.json unless they specified their own version (or had another global.json up the projects folder structure before it made it to the root of the C drive).
For the full details see the matching rules in the official docs.
Wrapping Up
I’m not sure if anyone one else is in this boat, but until I saw the build warning from above the need to control the SDK version never crossed my mind. Thankfully the teams have Microsoft have made the ability to lock to a version of the SDK simple. I could see this being especially useful if you are required to stick with a long-term support version of the SDK, which would currently require you to be on version 1.0 or 1.1.
Also published on Medium.