Spécifiez le chemin vers node_modules dans package.json


96

Existe-t-il un moyen de déplacer le répertoire node_modules dans une application pour dire / vendor / node_modules comme le fait bower avec le fichier bowerrc? Je pensais que cela pouvait être spécifié dans package.json mais je n'arrive pas à trouver une solution. Votre aide est très appréciée.



@blunderboy merci pour le lien. C'est fou qu'il n'y ait pas de moyen plus simple de le faire. Tant pis.
sturoid

26
Je ne sais pas pourquoi vous avez accepté une réponse qui ne répond clairement pas à votre question. Vous demandez comment définir le chemin vers node_modules inpackage.json , et la réponse de xShirase ne fournit tout simplement pas un moyen de le faire.
Mark Amery

4
Il a probablement accepté la réponse car c'est très clairement un problème XY et une solution alternative vaut mieux que «désolé, ce n'est pas possible».
Jake Holzinger le

Réponses:


58

oui vous pouvez, définissez simplement la variable d'environnement NODE_PATH:

export NODE_PATH='yourdir'/node_modules

D'après le doc:

Si la variable d'environnement NODE_PATH est définie sur une liste de chemins absolus délimités par deux-points, alors node recherchera ces chemins pour les modules s'ils ne sont pas trouvés ailleurs. (Remarque: sous Windows, NODE_PATH est délimité par des points-virgules au lieu de deux-points.)

De plus, node recherchera dans les emplacements suivants:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / nœud

Où $ HOME est le répertoire personnel de l'utilisateur et $ PREFIX est le préfixe node_prefix configuré du nœud.

Ce sont principalement pour des raisons historiques. Nous vous encourageons vivement à placer vos dépendances localement dans les dossiers node_modules. Ils seront chargés plus rapidement et de manière plus fiable.

La source


1
C'est super. Donc, dans mon cas où j'ai des node_modules locaux pour chaque application que je construis, est-ce que je ferais cette exportation dans un fichier js dans le projet?
sturoid

3
non, c'est une variable d'environnement, elle est configurée au niveau du système. Vous devez donc le saisir dans votre terminal. Les variables env sont accessibles dans une application de nœud dansprocess.env
xShirase

Hmmm sonne bien. Je vais devoir me pencher un peu plus dessus. Merci pour l'aide.
sturoid

112
Je ne pense pas vraiment que ce soit la réponse à la question: il demandait une propriété dans le package.json pour mettre un chemin pour les packages npm LOCAL (niveau application). Cette réponse lui indique comment il peut déplacer les paquets installés GLOBALEMENT (-g) dans un autre dossier.
David Losert

2
@IsmailIqbal Désolé, j'ai vu votre commentaire tout à l'heure. Cela fait deux ans dans le monde NPM et nous avons fait un pas de géant avec la mise en cache, le fil ou même npm5, le webpack ... Je dirais que la gestion de node_module de nos jours est bien meilleure. Dans votre cas, je ferais simplement une "installation npm" dans tous les emplacements - comme npm met en cache les packages déjà installés, cela revient à le copier manuellement sans la surcharge.
David Losert

28

En bref: ce n'est pas possible et, comme il semble, ne sera jamais pris en charge (voir ici https://github.com/npm/npm/issues/775 ).

Il y a des solutions de travail hacky avec l'utilisation de la CLI ou des variables ENV (voir la réponse actuellement sélectionnée), .npmrc-Config-Files ou npm link- ce qu'ils ont tous en commun: ils ne sont jamais seulement spécifiques au projet, mais toujours d'une certaine sorte des globalsolutions.

Pour moi, aucune de ces solutions n'est vraiment propre car les contributeurs à votre projet ont toujours besoin de créer une configuration spéciale ou d'avoir des connaissances particulières - ils ne peuvent pas simplement npm installet cela fonctionne.

Donc: Soit vous devrez mettre votre package.json dans le même répertoire où vous voulez que vos node_modules soient installés, soit vivre avec le fait qu'ils seront toujours dans le répertoire racine de votre projet.


16
"Si vous voulez épeler" node_modules "différemment, désolé, non. C'est intégré à node-core. Changer cela revient à créer un gestionnaire de paquets complètement différent." <== bon travail en utilisant des variables je suppose.
stevedbrown

Un commentaire de 2019: il semble que yarn supporte le remplacement du répertoire des modules. Eh bien, yarn est un nouveau gestionnaire de paquets, je suppose.
Vanuan

10

Yarn prend en charge cette fonctionnalité:

# .yarnrc file in project root
--modules-folder /node_modules

Mais votre expérience peut varier en fonction des packages que vous utilisez. Je ne suis pas sûr que vous vouliez entrer dans ce terrier de lapin.


6

Je ne sais pas si c'est ce que vous aviez à l'esprit, mais je me suis retrouvé sur cette question car je n'ai pas pu installer node_modulesdans le répertoire de mon projet car il était monté sur un système de fichiers qui ne supportait pas les liens symboliques (un dossier «partagé» VM ).

J'ai trouvé la solution de contournement suivante:

  1. Copiez le package.jsonfichier dans un dossier temporaire sur un système de fichiers différent
  2. Courez npm install
  3. Copiez le node_modulesrépertoire résultant dans le répertoire du projet, en utilisant cp -r --dereferencepour développer les liens symboliques en copies.

J'espère que cela aidera quelqu'un d'autre qui se retrouvera sur cette question en cherchant un moyen de passer node_modulesà un système de fichiers différent.

Autres options

Il existe une autre solution de contournement, que j'ai trouvée sur le problème github auquel @Charminbear est lié , mais cela ne fonctionne pas gruntcar il ne prend pas en charge NODE_PATHselon https://github.com/browserify/resolve/issues/136 :

disons que vous avez /media/sf_sharedet que vous ne pouvez pas installer de liens symboliques là-dedans, ce qui signifie que vous ne pouvez pas installer npm à partir de /media/sf_shared/myprojectparce que certains modules utilisent des liens symboliques.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (vous pouvez créer un lien symbolique dans cette direction, vous ne pouvez tout simplement pas en créer un dans / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.