我正在尝试让spawn
执行rm -rf node_modules
命令,然后执行npm install
命令(在Windows 7上;nx命令是通过透明安装的CygWin获得的。所有nx命令在命令行中都能正常解析)。
一开始我使用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); });
然而,运行此代码会生成以下错误:
rm: unknown option -- ,
Try `rm --help' for more information.
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); });
然而,运行此代码会生成以下错误:
{
'0': {
[Error: spawn ENOENT]
code: 'ENOENT',
errno: 'ENOENT',
syscall: 'spawn'
}
}
如何使 spawn 运行与使用 exec
相同的命令,而不会出现错误?为什么这样做不起作用?阅读API http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options,似乎表明这正是应该使用 spawn 的方式...
.cmd
文件几乎是相同的东西,但并不完全相同。 - tadmanexec("npm install ...")
,它在 Windows 上是可行的,而spawn
则会失败。尽管exec
不会提供实时的 stdout/stderr 数据(据我所知)。 - huysentruitwchild = spawn('cmd', ['/c', 'rm -rf node_modules'], {env:process.env});
。 - Nick Sotiros