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...

32
demandé sur Mike 'Pomax' Kamermans 2013-07-08 01:53:26

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.platformwin32 pour windows.

var npm = (process.platform === "win32" ? "npm.cmd" : "npm"),
    child = spawn(npm, ["install", ...]);
...
60
répondu Mike 'Pomax' Kamermans 2016-03-02 16:26:54

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.

0
répondu Brian 2013-07-08 20:42:08

Utilisez le chemin complet pour le processus, comme:

var cmd = require('child_process').spawn("C:\windows\system32\cmd.exe");
-1
répondu 2015-03-09 10:39:21