node child_process node.js promise gulp child-process

node.js - child_process - process send node



child_process.exec/spawn activa la devolución de llamada/cierra con el comando npm install(a través de Gulp/Shipit) (2)

  • Estoy usando Shipit para la implementación.
  • En la implementación, Shipit revisa el Git Sha actual, a un directorio tmp, luego npm install seguido de la gulp build , luego procede con la implementación.
  • Shipit usa Orchestrator para su flujo de tareas, como lo hace Gulp.
  • Shipit tiene su propia CLI, por lo que puedo implementar con shipit development deploy .

Todo lo que está arriba funciona Lo que intento hacer es crear una tarea de gulp deploy tramposa que inicialice Shipit directamente, en lugar de usar la CLI. Se ve algo como esto:

gulp.task(''shipit:deploy'', function() { var deployToEnv = argv[''deploy-to''] || false; var shipit; return inquirer.prompt([{ type: ''list'', name: ''deployToEnv'', default: deployToEnv, message: ''Deploy to environment:'', choices: envs }]).then(function(answers) { deployToEnv = answers.deployToEnv; shipit = new Shipit({environment: deployToEnv}); shipit.initialize(); shipit.start(''deploy''); }); });

Configuración de shipit correspondiente:

shipit.initConfig(config); shipit.blTask(''build'', function() { return shipit.local(''npm install --silent'', { cwd: shipit.config.workspace }).then(function() { return shipit.local(''gulp build'', { cwd: shipit.config.workspace }); }); }); shipit.on(''fetched'', function() { shipit.start(''build''); });

Las cosas parecen funcionar con un problema: ¡en realidad no realiza la npm install !

Running "npm install --silent" on local. Running "gulp build" on local.

Entonces, parece que algo en el npm install está resolviendo prematuramente la promesa, pero no estoy seguro cómo o por qué.

Tuve un problema similar (solo uso de shipit cli) con advertencias de npm, que es cuando descubrí que el uso de --silent arg resuelto eso.

Como prueba, dejé el código tal como está, pero npm install --silent con sleep 10 . Efectivamente, esperó 10 segundos antes de ejecutar la gulp build . Por lo tanto, parece que es algo específico con el npm install .

¡Cualquier ayuda es apreciada!

Actualización # 1:

shipit.local usa child_process.exec . Traté de convertir esto para usar child_process.spawn , pero tuve el mismo resultado.

Actualización # 2:

Si cambio el comando para sudo npm install , ¡las cosas funcionan como esperaba! Entonces ... ¿qué significa esto, y cómo puedo evitar ejecutarlo con sudo ?

Actualización # 3:

Todavía no puedo hacer esto sin sudo, pero intenté agregar el indicador --verbose con estos resultados:

Sin sudo :

@ npm info it worked if it ends with ok @ npm verb cli [ ''/Users/timkelty/.nvm/versions/node/v0.12.0/bin/node'', @ npm verb cli ''/Users/timkelty/.nvm/versions/node/v0.12.0/bin/npm'', @ npm verb cli ''install'', @ npm verb cli ''--verbose'' ] @ npm info using [email protected] @ npm info using [email protected] @ npm verb install where, deps [ ''/Users/timkelty/tmp/edwards-garment-website'', [] ] @ npm verb install where, peers [ ''/Users/timkelty/tmp/edwards-garment-website'', [] ] @ npm info preinstall [email protected] @ npm info build /Users/timkelty/tmp/edwards-garment-website @ npm verb linkStuff [ false, false, false, ''/Users/timkelty/tmp'' ] @ npm info linkStuff [email protected] @ npm verb linkBins [email protected] @ npm verb linkMans [email protected] @ npm verb rebuildBundles [email protected] @ npm info install [email protected] @ npm info postinstall [email protected] @ npm verb exit [ 0, true ] @ npm info ok Running "gulp build" on local. @ [15:14:32] Local gulp not found in ~/tmp/edwards-garment-website @ [15:14:32] Try running: npm install gulp ''build'' errored after 755 ms Error: Command failed: /bin/sh -c gulp build

Con sudo :

Running "sudo npm install --verbose" on local. @ npm info it worked if it ends with ok @ npm verb cli [ ''/Users/timkelty/.nvm/versions/node/v0.12.0/bin/node'', @ npm verb cli ''/Users/timkelty/.nvm/versions/node/v0.12.0/bin/npm'', @ npm verb cli ''install'', @ npm verb cli ''--verbose'' ] @ npm info using [email protected] @ npm info using [email protected] @ npm verb install where, deps [ ''/Users/timkelty/tmp/edwards-garment-website'', @ npm verb install [ ''Select2'', @ npm verb install ''autoprefixer-core'', @ npm verb install ''babel'',

... así que por alguna razón, cuando se ejecuta sin sudo, el comando npm install parece pensar que no tiene ninguna dependencia para instalar, por lo que finaliza sin error y continúa con mi siguiente tarea.


¡Encontré la solución!

El problema era que estaba intentando instalar devDependencies , pero cuando ejecuté el comando gulp deploy , NODE_ENV se configuró en producción, que no instala devDependencies.

Por lo tanto, cambiar el comando a NODE_ENV=development npm install parece solucionarlo.


Después de la actualización n. ° 2, tengo más opciones para escribir por qué esta combinación no funciona / Antes que nada, necesitamos averiguar qué usuario ejecutar los comandos. Para hacer esto, necesita ejecutar el comando whoami y ver el resultado (puede hacerlo a través de ssh o la tarea de envío). La pregunta directa es qué privilegios no tiene el usuario para instalar paquetes.

Posible solución n. ° 1:

El usuario no tiene derechos en la carpeta tmp. Podemos verificarlo a través de ls -ld /path/to/tmp , salida esperada:

drwxrwxrwt 13 root root 280 May 8 19:42 /tmp

Debe verificar que todos los usuarios puedan escribir en tmp dir: drwxrwxrwx. Si no, puede establecerlo por chmod -R 755 .

Posible solución # 2:

Execute on npm se otorga solo en el usuario / grupo propietario, y nuestro usuario no tiene ninguno. Podemos verificarlo a través de ls -lL $(which npm) . Rendimiento esperado:

-rwxr-xr-x 1 root root 1881 Apr 19 07:12 /usr/../lib/node_modules/npm/bin/npm-cli.js

Si no hay permiso x en el archivo, entonces ejecute sudo chmod +x $(which npm) .

ACTUALIZACIÓN: después de esta pregunta también puede haber un problema no con su carpeta tmp, sino con la carpeta de depuración para npm. Intenta buscar uno y comprueba el permiso.

Espero que sean todas las opciones que podamos conocer.