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

Set CWD for NPM script that runs a binary

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

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

我需要能够调用 foo 作为 super NPM 脚本:

super/package.json

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

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

".." is not recognized as an internal or external command, operable program or batch file

或者我需要能够调用 foo 作为 super NPM 脚本:

super/sub/package.json

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

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

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

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

用 JSON 转义双引号将 npm 脚本中定义的路径括起来,即 \"...\".

例如:

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

这将 运行 成功跨平台 - 通过 windows cmd.exe 和 *nix sh.