web-dev-qa-db-fra.com

Npm postinstall uniquement sur le développement

J'ai le module npm avec le package.json suivant

{
  "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, alors je lance npm install --production. Mais dans ce cas, le script prepublish est appelé, mais il n’est pas nécessaire, car j’utilise des liens CDN en production.

Comment appeler le script postinstall uniquement après npm install mais pas après npm install --production?

27
just-boris

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

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

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

9
mgol

Je pense que vous ne pouvez pas choisir les scripts à exécuter en fonction de l'argument --production. Ce que vous pouvez faire, cependant, est de fournir un script qui teste la variable NODE_ENV et exécute uniquement bower install s'il ne s'agit pas de "production".

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

{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install"
  }
}
17
Sam Mikes

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 l'installation de npm n'a pas été exécutée avec --production, utilisez le code suivant.

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",
14
Synthe

Je travaille avec Windows, OSX et Linux, j'utilise donc 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 la variable process.env.NODE_ENV et effectue le travail.

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

fait partie de package.json

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

Tous les scripts postinstall.js

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

dernière ligne de gulpfile.js

module.exports = gulp;

il est important d'exporter gulp à partir de gulpfile.js car toutes les tâches se trouvent dans cette instance spécifique de gulp.

10
Giovanni Bruno

Solution moins dépendante de la nature unix de votre shell:

  "scripts": {
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff"
  },
6
Alexey Vishentsev

J'ai un problème plus général: je souhaite ignorer l'exécution du script postinstall sur des installations locales (directes), comme lorsque je développe le package et exécute yarn add --dev my-new-dependency.

C'est ce que je suis venu avec. Cela fonctionne avec npm et fil.

postinstall.js :

const env = process.env;
if (
    // if INIT_CWD (yarn/npm install invocation path) and PWD
    // are the same, then local (dev) install/add is taking place
    env.INIT_CWD === env.PWD ||
    // local (dev) yarn install may have been run
    // from a project subfolder
    env.INIT_CWD.indexOf(env.PWD) === 0
) {
    console.info('Skipping `postinstall` script on local installs');
}
else {
    // do post-installation things
    // ...
}

package.json :

"script": {
    "postinstall": "node postinstall.js",
    ...
0
Már Örlygsson

Atterri ici parce que j'ai eu le même problème. Nous nous sommes retrouvés avec une solution qui teste l’existence d’un paquet sous node_modules qui, je le sais, ne devrait être disponible qu’en développement. 

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

Cela fonctionne très bien pour moi sur le plan conceptuel, car les scripts de préparation appelés ici par lerna sont principalement destinés aux compilations ts-to-js.

0
Wouter Van Vliet

J'utilise if-env module. C'est moins verbeux.

PS: Je ne l'ai pas encore testé sous 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
JacopKane