Npm postinstall uniquement sur le développement

J'ai le module npm avec le paquet suivant.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"
  }
}

Lorsque je déploie mon application en production, Je ne veux pas installer devDependecies, donc je lance npm install --production. Mais dans ce cas, prepublish script sont appelés, mais il n'en a pas besoin, car j'utilise des liens CDN en production.

Comment appeler script postinstall seulement après npm install, mais pas après npm install --production?

25
demandé sur just-boris 2014-04-15 11:17:53

7 réponses

Les nouvelles versions de npm (& Yarn) incluent la prise en charge du script prepare qui est exécuté après chaque exécution de install mais uniquement en mode développement. En outre, le prepublish est obsolète. Cela devrait suffire:

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

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

2
répondu mgol 2018-04-03 11:59:06

Je pense que vous ne pouvez pas choisir quels scripts sont exécutés en fonction de l'argument --production. Ce que vous pouvez faire, cependant, est de fournir un script qui teste la variable NODE_ENV et n'exécute que {[3] } si ce n'est pas "production".

Si vous êtes toujours dans un environnement unix-y, Vous pouvez le faire comme ceci:

{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install"
  }
}
16
répondu Sam Mikes 2015-01-06 18:16:48

Cela ne fonctionne que si vous êtes sur un environnement de type unix:

Npm définit une variable d'environnement sur "true" lorsque l'installation est exécutée avec --production. Pour exécuter le script postinstall uniquement si npm install n'a pas été exécuté avec --production, utilisez le code suivant.

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",
13
répondu Synthe 2016-04-19 15:31:53

Je travaille avec windows, osx et linux donc j'utilise une solution non spécifique à l'environnement pour résoudre ce problème:

Dans le gestionnaire postinstall j'exécute un script js qui vérifie le processus.env.NODE_ENV variable et fait le travail.

Dans mon cas spécifique, je dois exécuter une tâche gulp uniquement dans le développement env:

Partie du paquet.json

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

Tous postinstall.js script

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

Dernière rangée de gulpfile.js

module.exports = gulp;

Il est important d'exporter gulp depuis le fichier gulpfile.js parce que toutes les tâches sont dans cette instance de gulp spécifique.

7
répondu Giovanni Bruno 2017-01-03 18:05:06

Solution qui dépend moins de la nature unix de votre shell:

  "scripts": {
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff"
  },
5
répondu Alexey Vishentsev 2016-11-11 15:28:52

J'utilise le moduleif-env . C'est moins verbeux.

PS: Je ne l'ai pas encore testé sur windows.

Installer avec:

npm i if-env

Que dans les scripts package.json:

"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
répondu JacopKane 2018-01-10 13:35:17

A atterri ici parce que j'avais le même problème. Fini avec une solution qui teste l'existence d'un paquet sous node_modules que je sais ne devrait être disponible que dans le développement.

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

Cela fonctionne bien pour moi conceptuellement, car les scripts de préparation ici appelés par lerna sont principalement des compilations ts-to-js.

0
répondu Wouter Van Vliet 2018-09-04 14:29:01