为运行二进制文件的NPM脚本设置CWD

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为运行二进制文件的NPM脚本设置CWD相关的知识,希望对你有一定的参考价值。

我有一个托管子项目并包含公共依赖项的超级项目:

super
  node_modules
    .bin
      foo-binary
      foo-binary.exe
    foo
  sub
    node_modules
    package.json
  package.json

我需要能够将foo称为super NPM脚本:

超/的package.json

"scripts": {
  "foo": "foo-binary" <-- should run with super/sub/ as CWD
}

在这种情况下,foo-binarysuper/作为CWD运行,而它应该与super/sub/一起运行。使用cd会导致跨平台问题;带有反斜杠的cd sub && ..\node_modules\.bin\foo-binary适用于Windows但不适用于* nix操作系统,而带有正斜杠的cd sub && ../node_modules/.bin/foo-binary在Windows上失败(在Windows 7上测试):

“..”不被识别为内部或外部命令,可操作程序或批处理文件

或者我需要能够将foo称为super NPM脚本:

超/子/的package.json

"scripts": {
  "foo": "../node_modules/.bin/foo-binary"
}

在这种情况下,特定于平台的路径也会在Windows上失败。

有几个原因导致sub不能将foo作为自己的依赖,其中一个原因是所有子项目应该始终使用相同的foo版本而不占用多个foo副本的空间。

在这种情况下,如何设置当前工作目录,跨平台,最好不要在项目中添加自定义脚本?

答案

使用JSON转义双引号(即"...")封闭npm脚本中定义的路径。

例如:

"scripts": {
  "foo": "cd sub && "../node_modules/.bin/foo-binary""
}

现在,这将通过windows cmd.exe和* nix sh成功跨平台运行。

以上是关于为运行二进制文件的NPM脚本设置CWD的主要内容,如果未能解决你的问题,请参考以下文章

Grunt:cwd的目的是什么?

将忽略脚本设置为 true 时,npm 的行为有何不同?

在linux中为脚本创建批处理文件包装器

node中__dirname__filenameprocess.cwd()process.chdir()表示的路径

node中__dirname__filenameprocess.cwd()process.chdir()表示的路径

npm scripts 使用指南