用msys_version调用npm install

时间:2015-03-12 17:50:57

标签: powershell npm psake

我需要确保安装了一些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:\项目\ MyProject的\应用\子项目\ node_modules \浏览器同步\ node_modules \ socket.io \ node_modules \ engine.io \ node_modules \ WS \建立\ 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任务的一部分失败。

这可能会发生什么?

1 个答案:

答案 0 :(得分: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-03-13,它确实如此)。这可能会改变。