msbuild和dotnet加载不同版本的Sdk.targets

时间:2019-01-04 04:47:31

标签: c# .net msbuild

当我运行msbuild /bl /v:q /nologo /restore时,它会从c:\Program Files\dotnet\sdk\2.1.502\Sdks\Microsoft.NET.Sdk\Sdk加载Sdk.props

但是,当我在同一台机器上运行dotnet /bl /v:q /nologo时,我看到Sdk.props是从c:\Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk加载的

为什么有区别?如何使dotnetmsbuild加载相同的SDK?

项目文件是这个:

<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>

编辑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 ≡]>

编辑2

为了证明构建工作的不同之处:

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 !]>

您可以从2.1.502中看到msbuild参考Sdk.targets的诊断日志,而dotnet的diag构建从不引用该版本,而是用于2.1.4

编辑3

识别差异的另一种方法是传递SourceRevisionId属性。较新的Sdk.Targets会使用它,较旧的Sdk.Targets会使用它。请观察(使用另一个项目):

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 ≡]>

可以看到dotnet调用了不同版本的msbuild-15.9.20+g88f5fadfbe15.9.21+g9802d43bc3。但是我不认为这是个问题,因为这是C:\Program Files\dotnet\sdk\2.1.502中的msbuild.dll,它似乎是正确的位置。

1 个答案:

答案 0 :(得分:0)

我发现在我的计算机上将MSBuildSDKsPath环境变量设置为 c:\ Program Files \ dotnet \ sdk \ 2.1.4 \ Sdks

为何如此,这是我的一个谜。如果我将其删除,则会使用正确的SDK,即2.1.502。

作为一种解决方法,我向构建脚本中添加了$ env:MSBuildSDKsPath = $ null。