J'essaie de créer un module npm doté d'un script postinstall
qui modifiera le package.json
de l'utilisateur et réinstallera les packages. J'y suis presque, mais le problème que j'ai, c'est que la CLI npm exécute mon script postinstall
trop tôt.
Existe-t-il un moyen, peut-être en utilisant une astuce au niveau du noeud ou du système, d'attendre la fin du processus npm install
complet avant l'exécution du script? Comme lorsque npm appelle mon script postinstall
, puis-je alors enregistrer un autre script à exécuter après la fin de npm install
?
Qu'est-ce que je veux dire par "trop tôt"? Par exemple, après yarn install
, le fichier yarn.lock
ne reflétera pas exactement le package.json
si mon script interfère avec yarn install
. Cependant, si mon script attend la fin complète de yarn install
, puis exécute un autre yarn install
, le fichier yarn.lock
sera précis et les autres commandes yarn install
afficheront "Déjà à jour".
Considérer la modification directe avec package.json est une mauvaise pratique, car les développeurs ne contrôleront plus les packages qu'ils ont installés, ni même leur nom de projet.
Par conséquent, les packages doivent plutôt demander au développeur de modifier le package.json lors de l'installation et de proposer une méthode permettant d'activer les développeurs pour un exécution à sec des modifications apportées.
TLDR; assurez-vous de donner votre plein consentement au développeur pour toute altération de package.json.
C'est pourquoi je pense que les méthodes alternatives sont préférables à l'utilisation d'un script postinstall. La solution la plus minimale que j'ai trouvée:
myinstall.js
const exec = require('child_process').exec;
exec('npm run install').on('exit', () => exec('npm run mypostinstall'));
package.json
"scripts": {
"myinstall": "node myinstall.js",
"mypostinstall": "echo \"myPostinstall called\""
},
Définissez le script mypostinstall
sur égal à postinstall
.
Remarque: dans l'exemple ci-dessus, il n'y a pas de traitement des erreurs, aucun texte n'est affiché et il n'y a pas d'écriture réelle dans le package.json. C'est pur pour illustrer comment faire pour exécuter du code après npm install
. La raison pour laquelle aucun texte n'est affiché est due à l'appel exec
, pour lequel un nouveau processus est appelé avec son "personnel" stdout. Vous pouvez également utiliser fork
, plus d’informations peuvent être trouvées ici dans la documentation du noeud.
J'ai tenté d'appeler npm install
au lieu de npm run myinstall
en définissant "install": "node myinstall.js"
. Cependant maintenant la exec('npm run install')
s’appellera récursivement.
postInstall
, comme vous l'avez découvert, a un mode d'exécution très inhabituel et des erreurs dans certaines versions de npm (toutes les versions antérieures à npm 3). Si vous avez 2 options que je peux vous donner en tête,
Option 1
C’est la solution la plus simple, utilisez ce script, c’est assez explicite, elle installera tout et, pour plus de sécurité, donnez à la post installation une fois de plus. Ce n’est pas la solution idéale, mais cela devrait fonctionner sans problèmes.
#!/bin/bash
npm install
npm run postinstall
Option 2
Essayez de déplacer votre devDependencies
vers dependencies
si possible. Pour certains utilisateurs, cela semble résoudre le problème postInstall
. Mais je ne le recommande pas devDependencies
sont là pour une raison.
METTRE À JOUR
Ok, je comprends le problème maintenant, mais il devrait être couvert avec une légère variation du script de l'option 1. Depuis votre script postinstall peut déjà gérer la modification et la réinstallation.
#!/bin/bash
npm install
cd (<path to your modue> && npm run postinstall)