Comment importer des modules globaux dans Node? J'obtiens "Erreur: Impossible de trouver le module <module>"?

145

J'essaie de configurer Node sur Mac OSX Lion. Tout semble fonctionner correctement, mais je n'arrive pas à importer quoi que ce soit des modules de mon dossier de modules globaux. J'obtiens l'erreur,

Error: Cannot find module <module>

Si j'exécute ceci node -e require.paths:, la réponse que j'obtiens est:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

Ce qui est correct, mes modules sont en effet installés dans / usr / local / lib / node_modules. Cependant, lorsque j'essaye d'exécuter un script, j'obtiens ceci:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

Mon .bash_profile ressemble à ceci:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

J'apprécierais vraiment de l'aide, je ne sais pas pourquoi je ne peux pas importer de bibliothèques.

Hanpan
la source
1
Vous savez que ce n'est pas exactement la manière préférée de faire les choses, non?
thejh
1
Pourriez-vous élaborer? Voulez-vous dire que je ne devrais pas installer de bibliothèques dans mon dossier global?
Hanpan
3
@Hanpan: La méthode préférée est d'installer les modules que vous souhaitez utiliser via require () localement.
thejh
1
Une réponse meilleure et plus mise à jour (qui ne repose pas sur npm link) peut être trouvée ici: stackoverflow.com/a/15646750/2671392
GGG
1
Je suis de la vieille école et j'ai l'habitude d'installer des bibliothèques dans le monde entier. Je n'ai jamais vu de raison convaincante pour une utilisation intensive des installations de bibliothèques locales. La classe mongodb que je suis en train de prendre finira avec près d'une centaine de petits projets au moment où nous aurons terminé, chacun contenant un ensemble de bibliothèques pour la plupart en double - mongodb, express, consolide, etc. Le passage aux langages interactifs laisse des dépôts des bibliothèques locales partout. Je dois avoir des milliers de bibliothèques Scala dans les référentiels Scala locaux. Ditto Meteor, groovy et rubis.
Stephen

Réponses:

116

Si vous utilisez npm> = 1.0, vous pouvez utiliser npm link <global-package>pour créer un lien local vers un package déjà installé globalement. ( Mise en garde: le système d'exploitation doit prendre en charge les liens symboliques. )

Cependant, cela ne va pas sans problèmes.

npm link est un outil de développement. C'est génial pour gérer les packages sur votre boîte de développement local. Mais le déploiement avec npm link pose essentiellement des problèmes, car il est très facile de mettre à jour les choses sans s'en rendre compte.

Vous pouvez également installer les packages localement et globalement.

Pour plus d'informations, consultez

Tadeusz Wójcik
la source
69
Je lis ceci et n'en crois pas mes yeux. Donc, si j'installe, disons express, puis que j'ai 20 projets à construire sur express, je dois l'installer 20 fois, pour chacun d'eux, dans chaque dossier de projet, encore et encore? Je n'ai pas beaucoup d'expérience avec les gestionnaires de paquets mais ça craint un peu ...
treznik
25
C'est exact, et si vous y réfléchissez, cela a du sens. La gestion locale de vos dépendances rend tout autonome et vous permet de spécifier une version spécifique d'une dépendance pour un projet donné (par exemple, le projet foo nécessite express 2.x, tandis que la barre de projet peut utiliser express 3 beta).
grahamb
43
J'ai eu du mal à comprendre la logique de cela pendant un certain temps également, mais après avoir vu mes amis Ruby lutter avec les mises à jour globales de paquets, se disputer sur les gemsets et souvent simplement ne jamais mettre à niveau, j'ai concédé que l'installation de dépendances localement est absolument la seule façon saine de faire. gestion des paquets .
timoxley
3
Je voudrais faire un parallèle entre cette situation et celle des bibliothèques de liaison statique par rapport aux bibliothèques de liaison dynamique en ce qui concerne la distribution de logiciels. Considérez que presque toutes les applications distribuées sur l'App Store iOS doivent relier statiquement des dépendances non fournies par le SDK iOS. Pourquoi est-ce fait? L'enfer mondial de la dépendance est une chose très réelle.
Steven Lu
1
Je crois également comprendre que npmle cache de (qui habite ~/.npm) facilitera le processus de réinstallation effectué dans vos différents emplacements.
Steven Lu
85

Node.js utilise la variable d'environnement NODE_PATHpour permettre de spécifier des répertoires supplémentaires à inclure dans le chemin de recherche du module. Vous pouvez utiliser npmlui-même pour vous dire où les modules globaux sont stockés avec la npm root -gcommande. Donc, en mettant ces deux ensemble, vous pouvez vous assurer que les modules globaux sont inclus dans votre chemin de recherche avec la commande suivante (sous Linux-ish)

export NODE_PATH=$(npm root --quiet -g)

Joël B
la source
3
Merci pour l' NODE_PATHindice de variable d'environnement. Cela a beaucoup aidé!
rekire le
7
Cela devrait être le meilleur commentaire
Adam Prax
J'ai dû définir NODE_PATHle chemin posix équivalent pour que npm fonctionne sur MSYS2. Je vous remercie.
Joyce Babu
Fonctionne également avec Windows et Git bash. Parfait. :-)
inf3rno
Cela rend votre .node_modulesdossier consultable, mais pour importer des modules à l'aide de require(), ils doivent toujours être installés dans votre répertoire de projet local (ou, alternativement, liés à l'aide de npm link). Les modules globaux ne peuvent pas être importés dans les projets, seuls les binaires / scripts peuvent être exécutés à partir de là.
Prahlad Yeri
65

Vous pouvez utiliser le lien npm pour créer un lien symbolique vers votre package global dans votre dossier projets.

Exemple:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Il ne fait que créer un dossier node_modules local, puis créer un lien symbolique express -> [répertoire global] / node_modules / express qui peut ensuite être résolu par require('express')

Nick Sotiros
la source
Est-ce compatible cross-OS?
UpTheCreek
Les versions plus récentes de Windows le prennent en charge depuis cette version: github.com/npm/npm/commit/… Pour les anciennes versions de Windows, essayez npmjs.com/package/npm-junction
Alex
22

Installez n'importe quel package dans le monde comme ci-dessous:

$ npm install -g replace  // replace is one of the node module.

Comme ce module de remplacement est installé globalement, si vous voyez votre dossier de modules de nœud, vous ne verrez pas de module de remplacement à cet endroit et vous ne pouvez donc pas utiliser ce package en utilisant require ('replace').

car avec require, vous ne pouvez utiliser que des modules locaux qui sont présents dans votre dossier de module de nœud.

Maintenant, pour utiliser le module global, vous devez le lier au chemin du module de nœud en utilisant la commande ci-dessous.

$ npm link replace

Maintenant, revenez en arrière et voyez votre dossier de module de nœud, vous pouvez maintenant y voir le module de remplacement et l'utiliser avec require ('replace') dans votre application car il est lié à votre module de nœud local.

Veuillez me faire savoir si des éclaircissements supplémentaires sont nécessaires.

user5341372
la source
14

Vous pouvez utiliser require avec le chemin d'accès au répertoire global du module comme argument.

require('/path/to/global/node_modules/the_module');

Sur mon mac, j'utilise ceci:

require('/usr/local/lib/node_modules/the_module');

Comment trouver où se trouvent vos modules globaux? -> Où npm installe-t-il les packages?

lingue
la source
7

Définition de la variable d'environnement NODE_PATH pour qu'elle pointe vers votre node_modulesdossier global .

Dans Windows 7 ou supérieur, le chemin est quelque chose comme %AppData%\npm\node_modulestandis que dans UNIX pourrait être quelque chose comme /home/sg/.npm_global/lib/node_modules/mais cela dépend de la configuration de l'utilisateur.

La commande npm config get prefix peut aider à découvrir quel est le chemin correct.

Dans les systèmes UNIX, vous pouvez l'accomplir avec la commande suivante:

export NODE_PATH=`npm config get prefix`/lib/node_modules/
Ben Xu
la source
0

J'utilise Docker. J'essaie de créer une image docker sur laquelle toutes mes dépendances de nœud sont installées, mais je peux utiliser mon répertoire d'application local au moment de l'exécution du conteneur (sans le polluer avec un répertoire ou un lien node_modules). Cela provoque des problèmes dans ce scénario. Ma solution de contournement est d'exiger du chemin exact où le module, par exemple require ('/ usr / local / lib / node_modules / socket.io')

Darin Londres
la source
-1

require.paths est obsolète.

Accédez au dossier de votre projet et tapez

npm install socket.io

qui devrait l'installer dans le dossier local ./node_modules où node le recherchera.

Je garde mes affaires comme ça:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Créer un fichier app.js

// app.js
var socket = require('socket.io')

maintenant lance mon application

node app.js

Assurez-vous que vous utilisez npm >= 1.0et node >= 4.0.

Jamund Ferguson
la source
8
Il demande comment utiliser les packages npm installés globalement.
UpTheCreek
@Jamund. Vous montrez comment utiliser les packages installés localement, mais la question d'origine concernait les packages globaux.
Vitaliy Markitanov