NodeJS besoin d'un module global/paquet
  j'essaie d'installer globalement et puis utiliser  forever  et  forever-monitor  comme ceci:  
  npm install -g forever forever-monitor   
 je vois la sortie habituelle et aussi les opérations qui copient les fichiers sur le chemin global, mais ensuite si j'essaie de require("forever");  je reçois une erreur disant que le module n'a pas été trouvé.  
  j'utilise la dernière version de node et npm et je suis déjà au courant du changement que npm a fait dans global vs local install, mais Je    vraiment ne veut pas   pour installer localement sur chaque projet et je travaille sur une plate-forme qui ne supporte pas  link  donc  npm link  après une installation globale n'est pas possible pour moi.  
ma question est: pourquoi je ne peux pas avoir besoin d'un paquet installé dans le monde entier? C'est une fonctionnalité ou un bug? Ou suis-je en train de faire quelque chose de mal?
PS: juste pour être clair: Je ne veux pas installer localement.
7 réponses
Dans Le Nœud.js, require ne regarde pas dans le dossier où les modules globaux sont installés.
vous pouvez corriger cela en définissant la variable D'environnement NODE_PATH. Sous Linux ce sera:
export NODE_PATH=/usr/lib/node_modules
  
  Note: cela dépend de l'endroit où vos modules globaux sont installés.
après avoir installé package globally vous devez lier le projet local avec le paquet global
npm install express -g
cd ~/mynodeproject/
npm link express  
  
  voir ici
S'excuse pour la Nécromancie mais je suis capable de spécifier des chemins codés pour des modules installés dans le monde entier:
var pg = require("/usr/local/lib/node_modules/pg");
  
  ce n'est pas parfait, mais étant donné Qu'Unity3d essaie de" compiler " tout javascript inclus dans le répertoire du projet, Je ne peux pas installer de paquets.
 je sais que c'est une vieille question, mais je suis tombé sur cela en essayant de faire quelque vérification de version en utilisant semver dans un preinstall script dans package.json .  Puisque je savais que je ne pouvais pas compter sur aucun module Local installé, j'ai utilisé ceci pour exiger  semver  du dossier global  node_modules  (comme npm dépend de cela, je sais qu'il est là): 
function requireGlobal(packageName) {
  var childProcess = require('child_process');
  var path = require('path');
  var fs = require('fs');
  var globalNodeModules = childProcess.execSync('npm root -g').toString().trim();
  var packageDir = path.join(globalNodeModules, packageName);
  if (!fs.existsSync(packageDir))
    packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm
  if (!fs.existsSync(packageDir))
    throw new Error('Cannot find global module \'' + packageName + '\'');
  var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString());
  var main = path.join(packageDir, packageMeta.main);
  return require(main);
}
  
  j'aime cette approche, car cela ne nécessite pas l'installation de modules spéciaux pour utiliser.
 Je ne suis pas allé avec une solution NODE_PATH comme d'autres l'ont suggéré car je voulais que cela fonctionne sur la machine de n'importe qui, sans avoir besoin de configuration/configuration supplémentaire avant d'exécuter npm install  pour mon projet.  
  de la façon dont cela est codé, il est seulement garanti de trouver des modules de haut niveau (installés en utilisant  npm install -g ...  ) ou les modules requis par  npm  (énumérés comme  dependencies  ici:    https://github.com/npm/npm/blob/master/package.json   ).  Si vous utilisez une version plus récente de NPM, il se peut que vous trouviez des dépendances d'autres paquets installés à l'échelle mondiale, car il existe maintenant une structure plus plate pour les dossiers  node_modules .  
Espère que ce sera utile à quelqu'un.
  vous pouvez utiliser le paquet     requireg     pour résoudre ce problème:  
var forever = require('requireg')('forever')
  
  fera l'affaire.
  aussi, il y a un autre module,     global-npm     , bien que spécifique à l'utilisation du global  npm , vous pouvez regarder le  code court   et voir comment la technique fonctionne.   
selon documentation , Node.js va rechercher dans les endroits suivants par défaut:
-    
trajectoire spécifiée dans la
NODE_PATHvariable d'environnement .Note:
NODE_PATHla variable d'environnement est définie à une liste de chemins absolus délimitée par deux points. -   
courant
node_modulesle dossier. (local) -    
$HOME/.node_modules(global)Note:
$HOMEest le répertoire personnel de l'utilisateur. -       
$HOME/.node_libraries(mondiale) -    
$PREFIX/lib/node(global)Note:
$PREFIXest un noeud.js a configurénode_prefix.pour vérifier la valeur actuelle de
node_prefix, Lancez:node -p process.config.variables.node_prefixNote: le préfixe correspond à
--prefixparam pendant la construction et il est relatif àprocess.execPath. Ne pas confondre avec la valeur de la commandenpm config get prefix. source 
If le module ne peut pas être trouvé, ce qui signifie qu'il n'est pas présent dans l'un des emplacements ci-dessus.
  L'emplacement du dossier racine global où les modules sont installés peut être imprimé par: npm root -g (par défaut le chemin est calculé au moment de l'exécution à moins qu'on ne l'annule dans   npmrc fichier  ).  
Solution
vous pouvez essayer les solutions de contournement suivantes:
-    
Spécifiez l'emplacement de votre module global dans la variable d'environnement
NODE_PATH. Par exemple:echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" nodepour tester et imprimer la valeur de
NODE_PATH, Lancez:echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node -   
pour une solution plus permanente, liez votre dossier utilisateur global
$HOME/.node_modulesau dossier racine, en lançant cette commande:ln -vs "$(npm root -g)" "$HOME"/.node_modulespuis ré-tester via la commande
echo 'require("forever")' | node. -   
changer temporairement le dossier courant à l'endroit où l'extension a été installée globalement, avant d'invoquer le script. Par exemple:
npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd - -    
Configurer global de l'installation de destination dans
npmuserconfig fichier (voir:npm help 5 npmrc) ou paruserconfigparam (--prefix).Pour afficher la configuration actuelle, exécutez:
npm config list.pour éditer la configuration actuelle, exécutez:
npm config edit. -   
spécifiez le chemin complet de emplacement des modules de noeuds lorsque vous appelez
require(). Par exemple:require("/path/to/sub/module") -   
installer le paquet à un emplacement personnalisé, p.ex.
npm install forever -g --prefix "$HOME"/.node_modulesToutefois, l'installation d'aller sous
~/.node_modules/lib/node_modules/, de sorte que l'emplacement doit encore être ajoutés.Voir: npm local package d'installation à l'emplacement personnalisé
 -   
" créer un lien symbolique dans le dossier courant à partir de l'emplacement du paquet global. Par exemple:
npm link forever 
  Vous pouvez mettre cette ligne dans votre  .profile  fichier:  
exporter NODE_PATH="$(mnp config obtenir prefix)/lib/node_modules"
 cela fera node  utiliser le chemin global.