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é?
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.
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.
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
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?
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.