web-dev-qa-db-fra.com

Exécuter npm le script `postinstall` après la fin de` npm install` d'origine? (Peut-être en utilisant un truc de nœud?)

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".

16
M.K. Safi

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.

3
jervtub

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)
0
Kalana Demel