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