-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Description
Microsoft.AspNetCore.App, unlike normal NuGet packages, represents a shared framework. This means the package provides:
- A) The minimum expected version of of the ASP.NET Core shared runtime (found in C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App$(PackageVersion))
- B) A baseline of assemblies versions which the SDK expects to find in the shared runtime
- C) References assemblies for the compiler
- D) Implementations assemblies for self-contained deployments
There is tension between these as we want the lowest possible version of (A) to simplify deployment concerns, the highest version of (D) for security updates and patch fixes, and a version of (B) and (C) compatible with both (A) and (D).
We attempted to solve this tension in 2.1.0 by optimizing for (A) and hiding the package version from users and keeping it low, pinned to 2.1.0. That made it difficult to use packages which shared dependencies with the shared framework. In 2.1.1, we tried to fix this by easing off the restrictions and allowing package upgrades, but means users unintentionally upgrade out of the baseline (B), and end up with redundant copies of binaries in their publish output.
After lots of design discussion reviewing half a dozen alternatives, we think it will be better in the long run to back to reverse course and encourage users to use an explicit version on the PackageReference to Microsoft.AspNetCore.App, and it regularly update it to latest.
Proposed changes
-
Update
dotnet newtemplates to include the latest Microsoft.AspNetCore.App package version in the .csproj file. -
Update Microsoft.NET.Sdk.Web to warn when Microsoft.AspNetCore.App is missing a package version.
- Text:
The package reference to Microsoft.AspNetCore.App is missing the Version attribute. Defaulting to Version="2.1.1"..
- Text:
-
Remove "IsImplicitlyDefined" = true from Microsoft.NET.Sdk.Web. This unblocks the NuGet UI from displaying updates.
Before:

After:

Downsides
One of the primary reasons for making the version implicit was to simplify deployment. As history since 2.0.0 has taught us, our users that updating a PackageReference should be sufficient to use the newest version of ASP.NET Core. However, there is one more step required: users need to install a compatible shared runtime. This step is not obvious from the NuGet Package UI in VS, and error messages indicating the missing runtime are sometimes hidden (e.g. IIS Express, Test Explorer).
Proposed enhancement
[Nate: July 9]: this was not implemented, and we are not planning to implement right now.
- Update Microsoft.NET.Sdk to produce a warning when compiling for a .NET Core shared framework which is not present on the machine (cc @dsplaisted @nguerrera).
