web-dev-qa-db-fra.com

Comment fonctionne l'installation de npm

J'utilise Node.js (via browserify ) pour chacune de mes applications Web, qui ont toutes des dépendances en commun et d'autres spécifiques à elles-mêmes. Chacune de ces applications possède un fichier package.json Qui spécifie les versions des modules dont elle a besoin.

À l'heure actuelle, j'ai un répertoire /node_modules Dans le dossier parent de mes applications pour les modules qu'ils doivent tous référencer, puis je place des modules spécifiques à l'application dans un dossier node_modules Dans le répertoire de cette application . Cela fonctionne très bien à court terme, car mes instructions require() sont capables de continuer à regarder vers le haut dans la structure du fichier jusqu'à ce qu'elles trouvent le répertoire node_modules Avec la bonne application.

Lorsque cela devient difficile, c'est quand je veux revenir à un ancien projet et exécuter npm install Pour m'assurer qu'il peut toujours trouver toutes les dépendances dont il a besoin. (Qui sait ce qui s'est passé depuis lors au niveau du répertoire parent.) J'avais l'impression que npm install Avait fait ceci:

  • pour chaque module répertorié dans package.json, vérifiez d'abord s'il est présent, en remontant le répertoire de la même manière que require . Si ce n'est pas le cas, installez-le dans le répertoire local node_modules (En créant ce répertoire si nécessaire).

Cependant, lorsque j'exécute npm install Dans un dossier d'application, il semble que tout soit installé localement, peu importe où il peut exister en amont. Est-ce le bon comportement? (Il est possible qu'il y ait une autre raison, comme une langue de mauvaise version dans mon package.json). Si ceci IS le comportement correct, y a-t-il un moyen pour que npm install Se comporte comme ci-dessus?

Ce n'est pas un problème de répliquer largement les modules dans chaque application, mais cela me semble désordonné et m'empêche d'apporter de petites améliorations aux modules communs et de ne pas avoir à mettre à jour chaque ancien fichier package.json. Bien sûr, cela pourrait être une bonne chose ...

28
Chris Wilson

Cependant, lorsque j'exécute npm install dans un dossier d'application, il semble que tout soit installé localement, peu importe où il peut exister en amont. Est-ce le bon comportement? (Il est possible qu'il y ait une autre raison, comme un mauvais langage de version dans mon package.json). Si ceci IS le comportement correct, y a-t-il un moyen pour que l'installation de npm se comporte comme ci-dessus?

Oui, c'est ce que fait npm install. Dans le code node.js, l'algorithme require a une séquence particulière de lieux, y compris en remontant le système de fichiers. Pourtant, npm install ne fait pas ça. Il s'installe juste en place. Les algorithmes qu'il utilise sont tous contraints à un seul node_modules répertoire sous votre répertoire actuel et il ne touchera rien au-dessus (sauf avec -g).

Ce n'est pas un problème de répliquer largement les modules dans chaque application, mais cela me semble désordonné et m'empêche d'apporter de petites améliorations aux modules communs et de ne pas avoir à mettre à jour chaque ancien fichier package.json. Bien sûr, cela pourrait être une bonne chose ...

Ouais, fondamentalement, vous vous trompez. Le flux de travail régulier s'adapte bien à Internet. Pour votre cas d'utilisation, cela crée un travail très fastidieux, mais vous pouvez également utiliser le versioning sémantique comme prévu et spécifier "mylib": "^1.0.0" dans votre package.json pour vos applications et soyez d'accord pour obtenir automatiquement des versions plus récentes la prochaine fois que vous npm install.

22
Peter Lyons