Cake NuGetRestore总是想要MSBuild14?

pat*_*dge 6 cakebuild

在尝试使用Cake v0.19.1在只知道Visual Studio 2017的机器上构建解决方案时,我似乎NuGetRestore无法接受设置MSBuildVersion = NuGetMSBuildVersion.MSBuild15.

获取特定的MSBuild版本是否有一些神奇的步骤NuGetRestore,我错过了?

产量

...

========================================
RestoreNuGet
========================================
Executing task: RestoreNuGet
Failed to load msbuild Toolset
  Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
An error occurred when executing task 'RestoreNuGet'.
Error: NuGet: Process returned an error (exit code 1).
Run Code Online (Sandbox Code Playgroud)

修剪build.cake

var target = Argument("target", "Default");
var solution = "./some-random.sln";

Task("Default")
.Does(() => {
    NuGetRestore(
        solution,
        new NuGetRestoreSettings {
            MSBuildVersion = NuGetMSBuildVersion.MSBuild15,
        }
    );
});

RunTarget(target);
Run Code Online (Sandbox Code Playgroud)

更新:获取NuGet v4

根据@ devlead的回答,我将build.ps1文件指向NuGet的v4.0.0并得到了这个输出.

Cannot find the specified version of msbuild: '15'
An error occurred when executing task 'RestoreNuGet'.
Error: NuGet: Process returned an error (exit code 1).
Run Code Online (Sandbox Code Playgroud)

在我的完整build.cake中,我vswhere稍后使用MSBuildSettings它可以转储它找到的MSBuild路径(我确认exe存在于Explorer中).

C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/amd64/MSBuild.exe
Run Code Online (Sandbox Code Playgroud)

dev*_*ead 2

确保您使用的是最新版本的 NuGet.exe,目前最新版本是 v4.0.0 ,但您还可以在https://dist.nuget.org上查看可用列表

如果您使用默认的build.ps1,您可以修改它以始终下载特定版本的 NuGet.exe

您可以通过删除Test.Path部分来执行此操作 - 这样它就不会在工具文件夹之外的其他位置查找 nuget.exe 。然后将下载 uri 更改为不使用最新稳定版本(当前为 v3.5.0),而是通过在build.ps1中更改特定版本

$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
Run Code Online (Sandbox Code Playgroud)

$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/v4.0.0/nuget.exe"
Run Code Online (Sandbox Code Playgroud)

将确保您始终下载exe 的v4.0.0 。

还可以使用一点 PowerShell 来验证工具中的正确版本,例如

if ((Get-ChildItem $NUGET_EXE `
    | % VersionInfo `
    | % ProductVersion `
    | ? { $_ -eq '4.0.0' }|Measure-Object).Count -eq 1)
{
   'Correct version'
} else {
   'Incorrect version'
}
Run Code Online (Sandbox Code Playgroud)