1

我需要确保安装了一些 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):错误MSB4019:导入的项目未找到“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Default.props”。确认声明中的路径正确,并且该文件存在于磁盘上。

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

这里会发生什么?

4

1 回答 1

1

不要问我是怎么知道的,但是 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. 我已经硬编码了一个指向 .NET Framework 的链接,PSake 通过执行一些相当复杂的注册表和文件夹探索来确定该链接——在你今天的机器上,或者将来某个时候在你的机器上,这个硬编码的框架将是错误的。
  2. 我的代码假定 PSake 添加到 PATH 的开头(从 2015 年 3 月 13 日开始,它确实如此)。这可能会改变。
于 2015-03-13T15:16:20.530 回答