El uso del spawn nodejs provoca errores de “opción desconocida -” y “”

Estoy intentando spawn un rm -rf node_modules seguido de npm install (en los comandos de Windows 7; nx cortesía de un CygWin instalado de manera transparente. Todos los comandos n x se resuelven en una línea de comandos).

Inicialmente tenía este uso de exec , pero quería capturar la información stdout / stderr tal como se produjo, así que pensé que usaría spawn y reescribí el código para usarlo. Sin embargo, eso rompe todo.

El comando rm , reescrito, se convirtió en esto:

 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); }); 

Sin embargo, ejecutar esto genera el siguiente error:

 rm: unknown option -- , Try `rm --help' for more information. 

El comando npm , reescrito, se convirtió en esto:

 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); }); 

Sin embargo, ejecutar esto genera el siguiente error:

 { '0': { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' } } 

¿Cómo hago que Spawn ejecute los mismos comandos que funcionaron bien usando exec sin que arroje errores por todos lados? ¿Y por qué esto no funciona? Al leer la API, http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options , parece sugerir que esta es precisamente la forma en que se supone que se debe usar spawn …

Después de probar muchas cosas diferentes, finalmente pude ver lo que realmente es “npm” en Windows, y resulta ser un script bash llamado npm , así como un guión por lotes nativo de windows llamado npm.cmd (sin idea) por qué es .cmd, debería ser .bat, pero ahí lo tiene). El npm de comandos de Windows verá npm , notará que no es un ejecutable, verá npm.cmd , y luego notará que IS es un ejecutable, y luego lo usará. Esto es útil cuando estás en un terminal, pero spawn() no hará ninguna de esas resoluciones: pasarlo npm lo hará fallar porque no es un ejecutable. npm.cmd como comando, sin embargo, funciona bien.

(Además, no estoy seguro de por qué rm estaba fallando antes, ya que en realidad funciona correctamente sin ningún cambio que pueda decir. Probablemente malinterprete eso como parte del problema cuando en realidad no lo era).

Entonces: si te encuentras con spawn diciendo ENOENT en Windows, cuando el comando que estás tratando de disparar funciona en un símbolo del sistema, averigua si el comando al que llamas es un ejecutable verdadero, o si hay un .bat / .cmd que el símbolo del sistema ejecutará “helpfully” en su lugar. Si es así, engendra eso.

editar

dado que esta publicación todavía está recibiendo votos ascendentes, una buena forma de asegurarse de que el comando siempre funcione es arrancarla en base a process.platform , que será win32 para Windows.

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

Creo que esto puede ser una especie de cygwin gotcha. Estoy ejecutando Ubuntu 12.04 e intenté duplicar tu problema, pero funciona bien para mí. En resumen, no veo nada que estés haciendo mal.

Si se queja acerca de la opción, tal vez divídala en varias opciones como esta:

 child = spawn("rm", ["-r", "-f", "node_modules"]); 

Es una especie de granizo, pero eso también funciona en mi Ubuntu 12.04. Puede intentar simplemente eliminar un solo archivo y ver si obtiene lo mismo.

 child = spawn("rm", ["/home/username/Desktop/TestFile"]); 

Si eso todavía falla, entonces sabes que estás trabajando contra algunas cosas locas.

Incluso podría intentar ejecutar un comando sin parámetros como ese:

 child = spawn("ls"); 

Si eso sigue fallando, no es probable que te engendren para trabajar, sería mi suposición y estaré agradecido de que al menos el ejecutivo esté trabajando.

No hay mucho en el ámbito de las respuestas para ti, pero como dije, no puedo ver nada de lo que estás haciendo incorrectamente.

Además, no veo cómo va a funcionar tu comando npm porque no estás especificando qué instalar, pero una vez dicho esto, falla de una manera diferente a la que veo aquí si utilizo el mismo comando . . . Veo mucha salida de stderr, no un error general.

Por cierto, estoy ejecutando el nodo v0.8.21. Puede consultar eso por el nodo -v. Si está ejecutando otra versión, tal vez pruebe 0.8.21.

Utilice la ruta completa para el proceso, como:

 var cmd = require('child_process').spawn("C:\\windows\\system32\\cmd.exe");