Npm postinstall solo en desarrollo


Tengo el módulo npm con el siguiente paquete.json

{
  "name": "my-app",
  "version": "0.0.0",
  "scripts": {
    "prepublish": "bower install",
    "build": "gulp"
  },
  "dependencies": {
    "express": "~4.0.0",
    "body-parser": "~1.0.1"
  },
  "devDependencies": {
   "gulp": "~3.6.0",
   "bower": "~1.3.2"
  }
}

Cuando despliegue mi aplicación en producción no quiero instalar devDependecies, así que corro npm install --production. Pero en este caso se llama a prepublish script, pero no es necesario, porque uso enlaces CDN en producción.

¿Cómo llamar al script postinstall solo después de npm install pero no después de npm install --production?

Author: just-boris, 2014-04-15

7 answers

Las versiones más recientes de npm (& Yarn) incluyen soporte para el script prepare que se ejecuta después de cada install pero solo en modo de desarrollo. Además, el prepublish está en desuso. Esto debería ser suficiente:

{
  scripts: {
    "prepare": "bower install"
  }
}

Docs: https://docs.npmjs.com/misc/scripts

 2
Author: mgol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 11:59:06

Creo que no puede elegir qué scripts se ejecutan basándose en el argumento --production. Lo que puede hacer, sin embargo, es proporcionar un script que pruebe la variable NODE_ENV y solo ejecute bower install si no es "producción".

Si siempre estás en un entorno unix-y, puedes hacerlo así:

{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install"
  }
}
 16
Author: Sam Mikes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 18:16:48

Esto solo funciona si estás en un entorno unix:

NPM establece una variable de entorno en "true" cuando install se ejecuta con production production. Para ejecutar el script postinstall solo si npm install no se ejecutó con production production, utilice el siguiente código.

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",
 13
Author: Synthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-19 15:31:53

Trabajo con windows, osx y linux, por lo que uso una solución NO específica del entorno para resolver este problema:

En el controlador postinstall ejecutoun script js que comprueba el proceso.env.NODE_ENV variable y hace el trabajo.

En mi caso específico tengo que ejecutar una tarea gulp solo en desarrollo env:

Parte del paquete.json

"scripts": {
  "postinstall": "node postinstall"
}

Todo postinstalado.js script

if (process.env.NODE_ENV === 'development') {
  const gulp = require('./gulpfile');
  gulp.start('taskname');
}

Última fila de gulpfile.js

module.exports = gulp;

Es importante exportar gulp desde el gulpfile.js porque todas las tareas están en esa instancia gulp específica.

 7
Author: Giovanni Bruno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-03 18:05:06

Solución que es menos dependiente de la naturaleza unix de su shell:

  "scripts": {
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff"
  },
 5
Author: Alexey Vishentsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 15:28:52

Estoy usando el módulo if-env. Es menos prolijo.

PS: Aún no lo he probado en Windows.

Instalar con:

npm i if-env

Que en package.json scripts:

"postinstall-production": "echo \"production, skipping...\"",
"postinstall-dev": "echo \"doing dev exclusive stuff\"",
"postinstall": "if-env NODE_ENV=production && npm run postinstall-production || npm run postinstall-dev"
 0
Author: JacopKane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-10 13:35:17

Aterricé aquí porque tenía el mismo problema. Terminé con una solución que prueba la existencia de un paquete bajo node_modules que sé que solo debería estar disponible en desarrollo.

{
  "scripts": {
    "postinstall": "bash -c '[ -d ./node_modules/@types ] && lerna run prepare || echo No postinstall without type info'" 
  }
}

Esto funciona bien para mí conceptualmente, ya que los scripts de prepare aquí llamados por lerna son principalmente compilaciones de ts a js.

 0
Author: Wouter Van Vliet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 14:29:01