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
?
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"
}
}
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"
}
}
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",
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.
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"
},
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"
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.