What are the differences between Microsoft.NET.Sdk and Microsoft.NET.Sdk.Web

Ad (1) and (3): What are the differences between the “core” and and web SDKs, how do these affect generic host apps?

The most important differences are:

  1. Default Items

    The web SDK has different definitions and globbing patterns for which files to include in your published application.

    E.g. when you have an appsettings.json file, projects using the web sdk will automatically include it since there are patterns in place that ensure that .config, .json files and all files in a wwwroot folder are all part of the publish output. See the MSBuild source code on GitHub for these patterns.

    If you have a generic host and don’t use the Web SDK, you may need to add code to the csproj file to specify which files to copy to the publish directory (or use an IDE to change the “copy to output directory” setting which also includes files in the publish output but will also copy them to the build output):

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    
  2. Web Publish logic

    Another essential part of the Web SDK is that it contains the deployment logic for web applications.

    If you plan to use publish profiles (.pubxml files) or deploy to azure or filesystems using MSBuild / MSDeploy, you will need this publishing logic.

Ad (2): Which SDK to use for class libraries?

For maximum compatibility when publishing public libraries (e.g. via NuGet), use the core SDK and reference individual packages with the lowest possible version – e.g. 2.1.0 / 2.1.1.

If you develop a class library containing razor views, you will need to use the Microsoft.NET.Sdk.Razor SDK to get razor tooling (e.g. when you use the dotnet new razorclasslib template).

For libraries and test projects where you want to use the same meta package reference as the application, things are a bit complicated at the moment but it’s going to get better:

For ASP.NET Core 2.1 tools(!) (CLI 2.1.*), I suggest using the non-web SDK for class libraries and use the version 2.1.1 of that package. Don’t ever upgrade it, even if NuGet offers you an upgrade.

For test projects in 2.1 tools(!) (CLI 2.1.*), it is a bit different and tricky, see Integration and unit tests no longer work on ASP.NET Core 2.1 failing to find assemblies at runtime

Beginning in 2.2 tools (CLI 2.2.100+), the version-less package references to ASP.NET Core metapackages are moved to the core SDK so you can develop libraries and test projects for both ASP.NET Core 2.1 and 2.2 using the “”core”” SDK (provided you use tools 2.2.100+) using version-less package references:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

In .NET Core / ASP.NET Core 3.0, you will be able to reference the framework via a new mechanism altogether (no web-SDK needed):

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

Leave a Comment