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.

108
demandé sur alexandernst 2013-03-26 15:49:07

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.

voir: chargement à partir des dossiers globaux .

163
répondu Daniel Uzunu 2018-01-07 17:45:27

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

79
répondu user568109 2017-03-14 00:49:10

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.

21
répondu Thomas Ingham 2018-01-04 16:59:40

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.

15
répondu Joe Skeen 2016-07-22 22:02:43

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.

14
répondu JP Richardson 2016-01-14 14:52:49

selon documentation , Node.js va rechercher dans les endroits suivants par défaut:

  1. trajectoire spécifiée dans la NODE_PATH variable d'environnement .

    Note: NODE_PATH la variable d'environnement est définie à une liste de chemins absolus délimitée par deux points.

  2. courant node_modules le dossier. (local)

  3. $HOME/.node_modules (global)

    Note: $HOME est le répertoire personnel de l'utilisateur.

  4. $HOME/.node_libraries (mondiale)
  5. $PREFIX/lib/node (global)

    Note: $PREFIX est un noeud.js a configuré node_prefix .

    pour vérifier la valeur actuelle de node_prefix , Lancez:

    node -p process.config.variables.node_prefix
    

    Note: le préfixe correspond à --prefix param pendant la construction et il est relatif à process.execPath . Ne pas confondre avec la valeur de la commande npm 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" node
    

    pour 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_modules au dossier racine, en lançant cette commande:

    ln -vs "$(npm root -g)" "$HOME"/.node_modules
    

    puis 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 npm userconfig fichier (voir: npm help 5 npmrc ) ou par userconfig param ( --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_modules
    

    Toutefois, 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
    
9
répondu kenorb 2018-09-12 11:11:04

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.

1
répondu Luis Paulo 2018-02-11 14:37:36