使用nodejs的spawn会导致"unknown option - "和"[Error:spawn ENOENT]"错误

Mik*_*ans 33 exec spawn node.js

我试图spawn实现一个rm -rf node_modules跟随npm install(在Windows 7; n x命令由透明安装的CygWin提供.所有n x命令在命令行上解析就好了).

我最初使用它exec,但想要捕获stdout/stderr信息,因此我想我会使用spawn,并重写代码使用它.然而,这打破了一切.

rm重写的命令变为:

var spawn = require("child_process").spawn,
    child = spawn("rm", ["-rf", "node_modules"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });
Run Code Online (Sandbox Code Playgroud)

但是,运行它会生成以下错误:

rm: unknown option -- ,

Try `rm --help' for more information.
Run Code Online (Sandbox Code Playgroud)

npm重写的命令变为:

var spawn = require("child_process").spawn,
    child = spawn("npm", ["install"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });
Run Code Online (Sandbox Code Playgroud)

但是,运行它会生成以下错误:

{
  '0': {
    [Error: spawn ENOENT]
    code: 'ENOENT',
    errno: 'ENOENT',
    syscall: 'spawn'
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使spawn运行相同的命令,使用得很好exec而不会在整个地方抛出错误?为什么这不起作用?阅读API,http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options,似乎表明这正是人们应该如何使用spawn ...

Mik*_*ans 63

经过大量尝试不同的事情之后,我终于看了一下"npm"实际上是在windows上,结果是一个名为bash的脚本npm,以及一个名为windows的本地批处理脚本npm.cmd(不知道为什么它是.cmd ,那应该是.bat,但你有它).Windows的命令解析器会看到npm,注意它不是可执行文件,请参阅npm.cmd,然后注意到它是一个可执行文件,然后将使用它.当你在终端时,这是有用的,但spawn()不会做任何这样的解决方案:传递它将npm使它失败,因为它不是可执行文件.npm.cmd然而,将它作为命令传递可以正常工作.

(另外,不知道为什么rm早些时候失败了,因为这实际上是正常工作而没有我可以告诉的任何变化.可能误读了作为问题的一部分而事实上它不是.)

所以:如果您spawn在Windows中遇到ENOENT,当您尝试触发的命令在普通命令提示符下工作时,请确定您正在调用的命令是否是真正的可执行文件,或者是否有.bat/ .cmd该命令的文件提示将"帮助"为你运行.如果是这样,产生那个.

编辑

由于这篇文章仍然是upvotes,确保命令始终有效的一个好方法是基于它来引导它process.platform,这将是win32针对Windows的.

var npm = (process.platform === "win32" ? "npm.cmd" : "npm"),
    child = spawn(npm, ["install", ...]);
...
Run Code Online (Sandbox Code Playgroud)

  • 尝试在Windows上执行`child = spawn('cmd',['/ c','rm -rf node_modules'],{env:process.env});` (3认同)
  • `.cmd` 文件[几乎是一样的](http://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd),但不完全一样。 (2认同)
  • 不,我不能拥有; 正如你所指出的,exec没有stdout和stderr处理,没有日志的npm安装是没用的. (2认同)