L'utilisation du spawn de nodejs provoque des erreurs " unknown option - "et" [Error: spawn ENOENT]"
je vais essayer d'obtenir spawn
une rm -rf node_modules
suivi de npm install
(sur windows 7; n commandes x gracieuseté d'un CygWin installé de façon transparente. Tous les n les commandes x résolvent sur une ligne de commande très bien).
j'ai d'abord utilisé exec
, mais voulait attraper l'information stdout/stderr comme il s'est produit, donc j'ai pensé que je voudrais utiliser spawn
, et réécrit le code pour l'utiliser. Cependant, qui casse tout.
rm
commande, réécrit, est devenu ceci:
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); });
cependant, exécuter ceci génère l'erreur suivante:
rm: unknown option -- ,
Try `rm --help' for more information.
npm
commande, réécrit, est devenu ceci:
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); });
cependant, exécuter ceci génère l'erreur suivante:
{
'0': {
[Error: spawn ENOENT]
code: 'ENOENT',
errno: 'ENOENT',
syscall: 'spawn'
}
}
Comment faire pour que spawn exécute les mêmes commandes qui ont bien fonctionné avec exec
sans qu'il vomisse des erreurs partout? Et pourquoi n'est-ce pas le travail? La lecture de l'API, http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options, semble suggérer, c'est précisément la façon dont on est censé utiliser spawn...
3 réponses
après avoir essayé beaucoup de choses différentes, j'ai finalement eu un regard sur ce que "npm" est réellement sur windows, et il s'avère être un script bash appelé npm
, ainsi qu'un windows natif script batch appelé npm.cmd
(aucune idée de pourquoi c'est .cmd, ça devrait l'être .chauve-souris, mais là, vous en avez). Le résolveur de commandes de Windows verra npm
, notez que ce n'est pas un exécutable, voir npm.cmd
, et puis noter que c'est un exécutable, et l'utiliser à la place. Ceci est utile lorsque vous êtes dans un terminal, mais spawn()
ne fera pas une telle résolution: de passage npm
le faire échouer parce que ce n'est pas un exécutable. En passant c' npm.cmd
comme commande, cependant, fonctionne très bien.
(d'ailleurs, je ne sais pas pourquoi rm
a échoué plus tôt, puisque cela fonctionne en fait correctement sans aucun changement que je peux dire. Probablement mal lu que dans le cadre du problème quand il fait pas.)
Donc: si vous exécutez dans spawn
dire ENOENT dans windows, quand la commande que vous essayez de trigger fonctionne dans une invite de commande simple, vérifiez si la commande que vous appelez est un vrai exécutable, ou s'il y a un .bat
/.cmd
le fichier qui l'invite "utilement" exécuter pour vous à la place. Si oui, spawn.
modifier
comme ce post est toujours en train de recevoir des upvotes, un bon moyen de s'assurer que la commande fonctionne toujours est de bootstrap il basé sur process.platform
win32
pour windows.
var npm = (process.platform === "win32" ? "npm.cmd" : "npm"),
child = spawn(npm, ["install", ...]);
...
je pense que c'est peut-être une sorte de cygwin gotcha. Je lance Ubuntu 12.04 et essayé de dupliquer votre problème, mais il fonctionne très bien pour moi. Bref, je ne vois rien que vous fassiez de mal.
Si c'est de se plaindre à propos de l'option, peut-être divisée en plusieurs options comme ceci:
child = spawn("rm", ["-r", "-f", "node_modules"]);
C'est le genre de un je vous salue marie, mais qui fonctionne sur mon Ubuntu 12.04. Vous pourriez essayer de juste supprimer un seul fichier et voir si vous obtenez la même chose.
child = spawn("rm", ["/home/username/Desktop/TestFile"]);
si cela échoue encore, alors vous savez que vous travaillez contre des choses folles.
vous pouvez même essayer d'exécuter une commande sans paramètres comme:
child = spawn("ls");
si cela échoue encore, vous n'êtes pas susceptible de faire fonctionner spawn serait mon avis et être reconnaissant qu'au moins exec fonctionne.
pas grand chose dans le domaine des réponses pour vous, mais comme je l'ai dit, Je ne vois rien que vous faites incorrectement.
en outre, Je ne vois pas comment votre commande npm va fonctionner parce que vous ne spécifiez pas quoi installer, mais cela étant dit, il échoue d'une manière différente que je le vois échouer ici si j'utilise la même commande. . . Je vois beaucoup de sortie stderr, pas une erreur générale.
BTW, j'exécute le noeud v0.8.21. Vous pouvez interroger cela par node-v. Si vous exécutez une autre version, peut-être donner 0.8.21 un essai.