psake 使用 msys_version 调用 npm install

psake calling npm install with msys_version

我需要确保安装了一些 NPM 依赖项,其中一些使用 node_gyp 进行编译。这意味着我必须调用 "npm install --msvs_version=2013" 以便 node_gyp 将使用我的 vs.net 2013 编译器。但出于某种原因,将其添加到 psake 任务失败。看起来它没有正确传递第三个参数。

task npmInstall {
  exec {npm install --msvs_version=2013}
}

调用“./psake npmInstall”导致它 运行,但 node_gyp 失败,因为它没有得到第三个参数。错误似乎很明显——它没有使用 2013 CPP 文件。它说 V110 的地方应该说 V120(通常通过调用 --msvs_version2013 来解决):

C:\Projects\MyProject\app\SubProject\node_modules\browser-sync\node_modules\socket.io\node_modules\engine.io\node_modules\ws\build\bufferutil.vcxproj(18,3): error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Default.props" was not found. Confirm that the path in the declaration is correct, and that the file exists on disk.

运行 直接在 powershell 中的命令工作正常。 运行 作为脚本一部分的命令在 powershell 中工作正常。即使 运行ning "Import-Module path/to/psake.psm1; exec {npm install --msvs_version=2013}" 直接在 powershell 中也能正常工作。它仅作为 psake 任务的一部分失败。

这里可能发生了什么?

别问我怎么知道的,gyp 失败是因为你的 PATH 环境变量中有 .NET Framework 文件夹。

PSake,而且只有 PSake,将 .NET Framework 文件夹添加到您的 PATH。这通常是一件好事,但今天却给你带来了麻烦。

要解决此问题,请执行以下操作:

task GypAngerIssues {
    if ($env:PATH -like "*C:\Windows\Microsoft.NET\Framework64\v4.0.30319\*") {
      $env:PATH = $env:PATH.Replace("C:\Windows\Microsoft.NET\Framework64\v4.0.30319\;", "")
    }
    exec { & npm install --msvs_version=2013}
}

面向未来的几点注意事项:

  1. 我已经将 link 硬编码到 .NET Framework 中,PSake 通过进行一些非常复杂的注册表和文件夹探查来确定它——今天在您的机器上,或者在未来某个时间在您的机器上,这硬编码框架将是错误的。
  2. 我的代码假定 PSake 添加到 PATH 的开头(截至 2015 年 3 月 13 日,它确实如此)。这可能会改变。