mark
mark

Reputation: 62712

msbuild and dotnet load different versions of Sdk.targets

When I run msbuild /bl /v:q /nologo /restore it loads Sdk.props from c:\Program Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk

However, when I run dotnet /bl /v:q /nologo on the same exact machine I can see that Sdk.props is loaded from c:\Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk

Why is the difference? How can I cause dotnet to load the same Sdk as msbuild?

The project file is this:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="DbUpgradeApi" Version="1.0.363.6" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
  </ItemGroup>
</Project>

EDIT 1

C:\xyz\LogDbUpgradeProgress [master ≡]> dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   2.1.502
 Commit:    c74ce8f29f

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.16299
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.502\

Host (useful for support):
  Version: 2.1.6
  Commit:  3f4f8eebd8

.NET Core SDKs installed:
  1.0.0-preview2-003131 [C:\Program Files\dotnet\sdk]
  2.1.4 [C:\Program Files\dotnet\sdk]
  2.1.403 [C:\Program Files\dotnet\sdk]
  2.1.500 [C:\Program Files\dotnet\sdk]
  2.1.502 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 1.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.0.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download
C:\xyz\LogDbUpgradeProgress [master ≡]> Test-Path global.json
False
C:\xyz\LogDbUpgradeProgress [master ≡]> Test-Path ..\global.json
False
C:\xyz\LogDbUpgradeProgress [master ≡]> Test-Path ..\..\global.json
False
C:\xyz\LogDbUpgradeProgress [master ≡]>

EDIT 2

To demonstrate the point that builds work differently:

C:\xyz\LogDbUpgradeProgress [master ≡]> msbuild /v:diag > msbuild.diag.log
C:\xyz\LogDbUpgradeProgress [master ≡ +1 ~0 -0 !]> dotnet build /v:diag > dotnet.diag.log
C:\xyz\LogDbUpgradeProgress [master ≡ +2 ~0 -0 !]> cat .\msbuild.diag.log | sls "\bSdk\.targets" | select -First 1

Property reassignment: $(MSBuildAllProjects)=";C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props;C:\xyz\LogDbUpgradeProgress\Directory.Build.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.SupportedTargetFrameworks.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.CSharp.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.targets" (previous value: ";C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props;C:\xyz\LogDbUpgradeProgress\Directory.Build.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.SupportedTargetFrameworks.props;C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.CSharp.props") at C:\Program
Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.targets (15,5)


C:\xyz\LogDbUpgradeProgress [master ≡ +2 ~0 -0 !]> cat .\dotnet.diag.log | sls "\bSdk\.targets" | select -First 1

                   Property reassignment: $(MSBuildAllProjects)=";c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props;C:\xyz\LogDbUpgradeProgress\Directory.Build.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.SupportedTargetFrameworks.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.CSharp.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.targets" (previous value: ";c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props;C:\xyz\LogDbUpgradeProgress\Directory.Build.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.SupportedTargetFrameworks.props;c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.CSharp.props") at c:\Program
Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.targets (15,5)


C:\xyz\LogDbUpgradeProgress [master ≡ +2 ~0 -0 !]> cat .\dotnet.diag.log | sls -SimpleMatch "2.1.502\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.target
s" | select -First 1
C:\xyz\LogDbUpgradeProgress [master ≡ +2 ~0 -0 !]>

As you can see the diag log of msbuild reference Sdk.targets from 2.1.502 whereas the diag build of dotnet never references that version and instead goes for 2.1.4

EDIT 3

Another way to recognize the difference is by passing the SourceRevisionId property. The newer Sdk.Targets makes use of it, the older does not. Please, observe (using another project):

C:\xyz\DbUpgradeApi [master ≡]> git clean -qdfx
C:\xyz\DbUpgradeApi [master ≡]> msbuild /restore /v:q /p:SourceRevisionId=123
Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

C:\xyz\DbUpgradeApi [master ≡]> (dir .\src\bin\Debug\net452\DbUpgradeApi.dll).VersionInfo.ProductVersion
1.0.0+123
C:\xyz\DbUpgradeApi [master ≡]> git clean -qdfx
C:\xyz\DbUpgradeApi [master ≡]> dotnet build /v:q /p:SourceRevisionId=123
Microsoft (R) Build Engine version 15.9.20+g88f5fadfbe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.15
C:\xyz\DbUpgradeApi [master ≡]> (dir .\src\bin\Debug\net452\DbUpgradeApi.dll).VersionInfo.ProductVersion
1.0.0
C:\xyz\DbUpgradeApi [master ≡]>

One can see that dotnet invokes a different version of msbuild - 15.9.20+g88f5fadfbe vs 15.9.21+g9802d43bc3. But I do not think it is a problem, since this is the msbuild.dll from C:\Program Files\dotnet\sdk\2.1.502 which seems to be the right location.

Upvotes: 1

Views: 3539

Answers (1)

mark
mark

Reputation: 62712

I found out that MSBuildSDKsPath environment variable was set on my machine to c:\Program Files\dotnet\sdk\2.1.4\Sdks

It is a mystery to me why this is so. If I remove it, then the right Sdk is used, i.e. 2.1.502.

As a workaround I am adding $env:MSBuildSDKsPath = $null to my build script.

Upvotes: 3

Related Questions