Recently I have faced this issue in one of our Self-hosted agents in Azure
DevOps when a pipeline is trying to build a .NET 8.0 application.
C:\vsts-agent\_work\_tool\dotnet\sdk\5.0.405\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(141,5):
error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.
Either target .NET 5.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. [C:\vsts-agent\_work\67\s\xxxxx.csproj]
The error was happening in a NuGetCommand@2 task while doing a restore. I replaced that with a DotNetCoreCLI@2. Then that step succeeded but eventually failed again in a VSBuild@1 task (that was using vsVersion: '17.0' which is the latest) for the same reason.
This was strange because the pipeline was specifically requesting for
.NET 8.0.
- task: UseDotNet@2
displayName: Use .NET
inputs:
packageType: 'sdk'
version: '8.0.x'
The pipeline had no reason to use .NET SDK 5.0.405 and had no idea where this specific version was coming from.
Then I started digging, and after scratching my head for a couple of hours, noticed the following in agent worker logs (usually
inside C:\vsts-agent\_diag). To my surprise, the pipeline is getting executed with the following.
{
...
"variables": {
"DOTNET_MSBUILD_SDK_RESOLVER_SDKS_DIR": {
"value": "C:\\vsts-agent\\_work\\_tool\\dotnet\\sdk\\5.0.405\\Sdks"
},
"DOTNET_MSBUILD_SDK_RESOLVER_SDKS_VER": {
"value": "5.0.405"
},
...
}
...
}
DOTNET_MSBUILD_SDK_RESOLVER_* are .NET environment variables that are used to force the resolved
SDK tasks and targets to come from a given base directory and report a given
version to MSBuild.
- DOTNET_MSBUILD_SDK_RESOLVER_SDKS_DIR: Overrides the .NET SDK directory.
- DOTNET_MSBUILD_SDK_RESOLVER_SDKS_VER: Overrides the .NET SDK version.
- DOTNET_MSBUILD_SDK_RESOLVER_CLI_DIR: Overrides the dotnet.exe directory path.
And that kind of answered where .NET SDK 5.0.405 was coming from, but the question remains why. Submitted an Issue
#19520: Self hosted agent uses incorrect
DOTNET_MSBUILD_SDK_RESOLVER_SDKS_*.
To get past the issue, I had to override these variables. To test the concept,
I have overridden these variables by passing .NET 8.0 counterpart
values to the pipeline execution.
Passing variables to the pipeline execution |
variables:
- name: DOTNET_MSBUILD_SDK_RESOLVER_SDKS_DIR
value: 'C:\vsts-agent\_work\_tool\dotnet\sdk\8.0.101\Sdks'
- name: DOTNET_MSBUILD_SDK_RESOLVER_SDKS_VER
value: '8.0.101'
...
Now the pipeline builds and publishes .NET 8 apps successfully, but I still have no idea why the older SDK was being forced.
Hopefully, we will find it here soon:
Hope this helps.
Happy Coding.
Regards,
Jaliya
No comments:
Post a Comment