使用nodejs的spawn会导致“未知选项 – ”和“”错误
我尝试着spawn
一个rm -rf node_modules
然后是npm install
(在windows 7上; n x命令由一个透明安装的CygWin提供,所有n个 x命令都可以在命令行上parsing)。
我最初使用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' } }
我如何使产卵运行相同的命令,使用exec
罚款没有它抛出错误遍地? 为什么这不起作用? 阅读API, http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options ,似乎表明这正是一个人应该怎么使用产卵…
经过大量尝试不同的事情之后,我终于看到了“npm”实际上是在窗口上,结果是一个名为npm
的bash脚本,以及一个名为npm.cmd
的Windows本地批处理脚本(不知道为什么它是.cmd,这应该是.bat,但是你有它)。 Windows的命令parsing器会看到npm
,注意到它不是可执行文件,请参阅npm.cmd
,然后注意这是一个可执行文件,然后用它来代替。 这在terminal中很有用,但是spawn()
不会做任何这样的parsing:传递npm
会使它失败,因为它不是一个可执行文件。 传递npm.cmd
作为命令,但是,工作得很好。
(另外,不知道为什么rm
先前失败了,因为这实际上没有任何改变,可以正确地工作,可以把它看作是问题的一部分,而事实上并非如此。
所以:如果你在Windows下运行ENOENT,当你试图触发的命令在一个简单的命令提示符下运行时,找出你所调用的命令是否是一个真正的可执行文件,或者是否有一个.bat
/ .cmd
文件,命令提示符将“帮助”运行,而不是。 如果是的话,产卵。
编辑
由于这篇文章仍然是upvotes,确保命令始终工作的一个好方法是引导它基于process.platform
,这将是win32
的Windows。
var npm = (process.platform === "win32" ? "npm.cmd" : "npm"), child = spawn(npm, ["install", ...]); ...
我想这可能是某种cygwin疑难杂症。 我正在运行Ubuntu 12.04,并试图复制您的问题,但它对我来说工作得很好。 总之,我没有看到你做错了什么。
如果是抱怨这个选项,可能会把它分成多个选项,如下所示:
child = spawn("rm", ["-r", "-f", "node_modules"]);
这是一个冰雹玛丽,但也适用于我的Ubuntu 12.04。 你可能试着删除一个文件,看看你是否得到了同样的结果。
child = spawn("rm", ["/home/username/Desktop/TestFile"]);
如果仍然失败,那么你知道你正在反对一些疯狂的东西。
你甚至可以尝试执行一个没有参数的命令,例如:
child = spawn("ls");
如果还是失败了,你根本就不可能产卵,这将是我的猜测,并且至less有一位高pipe正在工作。
对于你来说,答案并不多,但正如我所说的,我看不出你做错了什么。
此外,我不明白你的npm命令是如何工作的,因为你没有指定要安装的东西,但是说到这里,如果我使用相同的命令,它会以不同的方式失败。 。 。 我看到很多stderr输出,不是一个总体错误。
顺便说一句,我正在运行节点v0.8.21。 您可以通过节点-v查询。 如果你正在运行另一个版本,也许给0.8.21一个尝试。
使用完整path的过程,如:
var cmd = require('child_process').spawn("C:\\windows\\system32\\cmd.exe");