web-dev-qa-db-fra.com

npm install si package.json a été modifié

TL; DR: Existe-t-il un moyen d'avoir npm install s'exécute automatiquement avant d'exécuter un script npm si votre package.json a été modifié?

Scénario de problème

Vous extrayez ou extrayez une branche qui a mis à jour package.json. Vous courez npm run my-script. my-script dépend d'un package qui vient d'être ajouté à package.json. my-script échoue. Tu te demandes pourquoi. Avant de retourner votre bureau, vous exécutez npm install juste pour être sûr. my-script s'exécute avec succès. Vous n'avez pas besoin d'un nouveau bureau.

Je sais que les outils d'exécution de build/tâche comme gradle s'assurent que vos dépendances sont à jour avant d'exécuter une tâche. J'ai toujours été un point de douleur (mineur) que npm ne le fait pas. Je suis tombé sur deux solutions que je n'aime pas particulièrement.

Solution non idéale: faire

Au lieu de compter sur des scripts npm dans votre package.json pour exécuter les commandes que vous utilisez make et utiliser son suivi de dépendance intégré avec l'astuce suivante:

# Smart install: Only executes if package.json's
# modification date is later than node_module's

node_modules: package.json
    npm install
    @rm -f node_modules/.modified
    @touch -m node_modules/.modified

install: node_modules 

Source: https://mattandre.ws/2016/05/make-for-hipsters/

Le problème est que vous savez que vous devez vous fier à make pour exécuter des scripts et perdre certains avantages des scripts npm, comme la référence à d'autres scripts et l'exécution de scripts en parallèle (npm-run-all). Il est également plus difficile de travailler avec d'autres personnes qui ne connaissent pas make ou qui ont des problèmes pour l'exécuter (Windows). C'est un outil archaïque en dehors de l'écosystème nœud/npm et trop coûteux juste pour cet avantage d'installation intelligente.

Solution non idéale: crochet Git

Une autre façon consiste à ajouter un post-merge git hook.

Le problème est que cette solution est locale au référentiel et ne peut pas être facilement partagée. npm install ne sera exécuté automatiquement que lors des fusions git. Lorsque vous modifiez package.json de toute autre manière, vous devez toujours vous souvenir d'avoir exécuté npm install. Certes, c'est un point mineur dans la pratique. Néanmoins, ce serait bien de ne jamais avoir à penser à courir npm install quand vous voulez exécuter un script.

Source: https://davidwalsh.name/git-hook-npm-install-package-json-modified

Solution idéale

Je voudrais définir mon package.json d'une manière similaire à:

{
  "scripts": {
    "pre-run": "npm-smart-install",
    "my-script": "…"
  },
  "dependencies": {
    "npm-smart-install": "1.0.0"
  }
}

npm-smart-install est un package npm hypothétique que je souhaite avoir existé. pre-run est un hook hypothétique du cycle de vie des scripts npm. Quand je lance npm run my-script et package.json a été modifié depuis la dernière exécution d'un script, exécutez npm install avant d'exécuter my-script.

Pour répéter: existe-t-il un moyen d'avoir npm install s'exécute automatiquement avant d'exécuter un script npm si votre package.json a été modifié sans s'appuyer sur des outils extérieurs à l'écosystème npm?

22
Eugen

Bon alors j'ai fini avec le paquet. Ici c'est. Vous pouvez l'utiliser exactement de la même manière que vous l'avez spécifié dans votre scénario idéal. Juste npm install install-changed et l'ajouter à un script personnalisé, comme pre-run dans votre exemple. Il devrait déterminer s'il doit ou non npm install et le fait si nécessaire.

 {
  "scripts": {
    "pre-run": "install-changed",
    "my-script": "…"
  },

Vous pouvez également le faire par programme, mais je ne pense pas que vous en aurez besoin.

let installChanged = require('install-changed')

let isModified = installChanged.watchPackage() 

La fonction ci-dessus fait exactement la même chose, en plus elle renvoie également une valeur booléenne que vous pourriez trouver utile.

3
ninesalt