Powershell psake调用msys_版本的npm安装

Powershell psake调用msys_版本的npm安装,powershell,npm,psake,Powershell,Npm,Psake,我需要确保安装了一些NPM依赖项,其中一些依赖项使用node_gyp进行编译。这意味着我必须调用“npm安装--msvs_version=2013”,以便node_gyp将使用我的vs.net 2013编译器。但由于某些原因,将此添加到psake任务失败。看起来它没有正确地传递第三个参数 task npmInstall { exec {npm install --msvs_version=2013} } 调用“/psake npmInstall”会导致它运行,但node_gyp失败,因为它

我需要确保安装了一些NPM依赖项,其中一些依赖项使用node_gyp进行编译。这意味着我必须调用“npm安装--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\u modules\browser sync\node\u modules\socket.io\node\u modules\engine.io\node\u 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}”也可以正常工作。它只是作为诗篇任务的一部分失败


这到底是怎么回事

不要问我是怎么知道的,但是gyp失败了,因为PATH环境变量中有.NET Framework文件夹

PSake(也是唯一的PSake)将.NET Framework文件夹添加到您的路径中。这通常是件好事,但今天却给你带来了麻烦

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

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}
}
未来校对的几点注意事项:

  • 我已经硬编码了一个指向.NET框架的链接,PSake通过做一些非常复杂的注册表和文件夹探索来确定这个链接——今天在你的机器上,或者将来某个时候在你的机器上,这个硬编码的框架将是错误的
  • 我的代码假设PSake会添加到路径的开头(截至2015年3月13日,它会添加)。这可能会改变

  • 闻起来像是在做奇怪的事情。如果你引用这样的论点:
    ”--msvs_version=2013“
    ?我尝试了很多方法来调用它,所有这些方法在powershell中都很好,但在psake中都没有成功。我引用了参数、run&“npm”@(“install”、“--msvs_version=2013”)等等。我甚至将npm命令放在一个批处理文件中,并让psake调用cmd/c theBatchFile.bat。这是一个真正的圣歌之谜!诗篇没有做任何特别的事。对我来说,它唯一真正搞砸的是它更改了当前的工作目录。但这与第三个论点无关;查找packages.json可能会导致一些问题。您得到的确切错误消息是什么?我已更新了我的问题,以包含确切的错误消息。您也可以通过
    拆分
    $env:PATH
    ,找到匹配项,将其拉出,然后重新生成路径。在任务开始时保存值,并在任务结束时将其设置回原来的值,这可能也是一个好主意。还有,你怎么知道的;Lold指出Peter找出了为什么这个过程在极其复杂的情况下失败的原因。这就是说,我做了一次可怕的黑客攻击,只是将gyp要查找的目录节点进行了符号链接。