Migrating an AspNetCore web and database application from version 2.2 to current .Net 6, I came across an occasional build error:
error NU1202: Package Microsoft.EntityFrameworkCore.Tools 6.0.1 is not compatible with netcoreapp2.2 (.NETCoreApp,Version=v2.2). Package Microsoft.EntityFrameworkCore.Tools 6.0.1 supports: net6.0 (.NETCoreApp,Version=v6.0)
The error went away by unchecking the Option “Allow NuGet to download missing packages” under “Nuget Package Manager”, so I did not bother any longer.
Unfortunately, the error returned as soon as I ran an Azure Build Task on the project. The task failed with a simple message
##[error]Packages failed to restore
without any indication what exactly failed, what was to be restored, and, especially, why.
Going through the log file, I found that nuget tried to restore packages for .Net 6 (good), but also für .NetCore 2.2 (bad):
2022-04-06T13:59:20.3799748Z Restoring packages for .NETCoreApp,Version=v6.0...
2022-04-06T13:59:20.4022386Z Resolving conflicts for .NETCoreApp,Version=v2.2...
2022-04-06T13:59:20.4605261Z Resolving conflicts for net6.0-windows7.0...
2022-04-06T13:59:20.5840720Z Checking compatibility of packages on .NETCoreApp,Version=v2.2.
2022-04-06T13:59:20.5886337Z Checking compatibility for microsoft.entityframeworkcore.tools-netcoreapp2.2-[6.0.1, ) 1.0.0 with .NETCoreApp,Version=v2.2.
2022-04-06T13:59:20.6014642Z Checking compatibility for Microsoft.EntityFrameworkCore.Tools 6.0.1 with .NETCoreApp,Version=v2.2.
2022-04-06T13:59:20.6016218Z 1>D:\DevOpsAgents\some\path\Project.Data.csproj : error NU1202: Package Microsoft.EntityFrameworkCore.Tools 6.0.1 is not compatible with netcoreapp2.2 (.NETCoreApp,Version=v2.2). Package Microsoft.EntityFrameworkCore.Tools 6.0.1 supports: net6.0 (.NETCoreApp,Version=v6.0)
I also noticed that the first lines of the log stated
Info: .NET Core SDK/runtime 2.2 and 3.0 are now End of Life(EOL) and have been removed from all hosted agents. If you're using these SDK/runtimes on hosted agents, kindly upgrade to newer versions which are not EOL, or else use UseDotNet task to install the required version.
[command]"C:\Program Files\dotnet\dotnet.exe" restore D:\DevOpsAgents\some\path\Project.sln
By that time, I had verified multiple times that the projects do not use any obsolete 2.2 packages anymore. Where does the reference come from?
Then I remembered that I had experienced *some *sort of build errors, as stated above, and tried to run a
dotnet restore on my development machine, disabling parallel execution and turning verbosity to full diagnostics:
dotnet restore my.project.sln --disable-parallel -v diag > dotnet-restore.log
The output is huuuge, so I piped it to a file.
Searching the generated log file for
netcoreapp2.2, I finally located these lines
17:37:29.274 10:4>_GenerateDotnetCliToolReferenceSpecs: (Target-ID:26)
TaskParameter:ToolFramework=netcoreapp2.2 (Task-ID: 17)
I found the target
_GenerateDotnetCliToolReferenceSpecs in the file
C:\Program Files\dotnet\sdk\6.0.101\NuGet.targets, and it sets the
DotnetCliToolTargetFramework build variable to a default value if it is not set already. The default value may be, depending on your installation,
netcoreapp2.2, or some other version.
Which part of the project would trigger an action referring to dotnet CLI tools? It’s the EF Core Tools I needed to install for database migrations:
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1"></DotNetCliToolReference>
This project setting causes dotnet to install the referenced tool, but fails to do so because the default tool framework is incompatible.
This observed behavior is documented in this GitHub issue for NuGet:
DotnetCliToolTargetFramework will be interpreted by NuGet restore as the maximum target framework that tools can be restored for
- When restoring .NET CLI tools, NuGet will first download the package, and inspect it to see what it targets. It will choose the maximum target framework the package explicitly supports that is less than or equal to the
This GitHub issue showed me how to set the framework version, so I added to my csproj file the following lines:
dotnet restore worked without errors.