NodeJS nécessite un module / package global

J’essaie de l’installer globalement, puis de l’utiliser forever et de 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 si j’essaie d’ require("forever"); J’ai une erreur en disant que le module n’a pas été trouvé.

J’utilise la dernière version des deux nœuds et npm et je connais déjà les changements apportés par npm dans les installations globales et locales, mais je ne veux vraiment pas installer locally sur chaque projet et je travaille sur une plateforme qui ne fonctionne pas. ne supporte pas le link donc le link npm link après une installation globale n’est pas possible pour moi.

Ma question est la suivante: pourquoi je ne peux pas exiger un package installé globalement? Est-ce une fonctionnalité ou un bug? Ou est-ce que je fais quelque chose de mal?

PS: Pour que ce soit clair: je ne veux pas installer localement.

Dans Node.js, require ne regarde pas dans le dossier où les modules globaux sont installés.

Vous pouvez résoudre ce problème en définissant la variable d’environnement NODE_PATH. Sous Linux, ce sera:

 export NODE_PATH=/usr/lib/node_modules 

Remarque: Cela dépend de l’endroit où vos modules globaux sont réellement installés.

Voir: Chargement depuis les dossiers globaux .

Après avoir installé le package globalement, vous devez lier le projet local au package global

 npm install express -g cd ~/mynodeproject/ npm link express 

Voir ici

Excuses pour la nécromancie mais je suis capable de spécifier des chemins codés en dur vers les modules installés globalement:

 var pg = require("/usr/local/lib/node_modules/pg"); 

Ce n’est pas parfait, mais vu que Unity3d essaie de “comstackr” tous les javascript inclus dans le répertoire du projet, je ne peux vraiment pas installer de paquet.

Je sais que c’est une vieille question, mais je me suis heurté à cela en essayant de faire une vérification de version en utilisant semver dans un script de preinstall dans package.json . Comme je savais que je ne pouvais pas compter sur les modules locaux installés, je les utilisais pour demander un semvernode_modules dossier global node_modules (car npm dépend, je sais que c’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').toSsortingng().sortingm(); 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')).toSsortingng()); 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 pouvoir l’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.

La façon dont cela est codé garantit uniquement la recherche de modules de niveau supérieur (installés à l’aide de npm install -g ... ) ou de modules requirejs par npm (répertoriés comme dependencies ici: https://github.com/npm/npm/ blob / master / package.json ). Si vous utilisez une version plus récente de NPM, celle-ci peut trouver des dépendances d’autres packages globalement installés, car il existe désormais une structure plus plate pour les dossiers node_modules .

J’espère que c’est utile à quelqu’un.

Vous pouvez utiliser le package requireg pour résoudre ce problème:

 var forever = require('requireg')('forever') 

fera le tour.

De plus, il existe un autre module, global-npm , bien que spécifique à l’utilisation du npm global, vous pouvez regarder le code court et voir comment fonctionne la technique.

Selon la documentation , Node.js effectuera une recherche par défaut dans les emplacements suivants:

  1. $HOME/.node_modules (global)

    Remarque: $HOME est le répertoire personnel de l’utilisateur.

  2. $HOME/.node_libraries (global)
  3. $PREFIX/lib/node (global)

    Remarque: $PREFIX est le node_prefix configuré de node_prefix

    Pour vérifier la valeur actuelle de node_prefix , exécutez:

     node -p process.config.variables.node_prefix 

    Remarque: Prefix correspond à --prefix param lors de la construction et est relatif à process.execPath . Ne pas confondre avec la valeur de la commande npm config get prefix . la source

  4. Dossier node_modules actuel. (local)

  5. Chemin spécifié dans la variable d’environnement NODE_PATH .

    Remarque: NODE_PATH variable d’environnement NODE_PATH est définie sur une liste de chemins absolus délimitée par deux points.

Si le module donné est introuvable, cela 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é à l’exécution, sauf s’il est remplacé dans le fichier npmrc ).

Solution

Vous pouvez essayer les solutions de contournement suivantes:

  • Indiquez 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 , exécutez:

     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 pour qu’il pointe vers le dossier racine, en exécutant cette commande:

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

    Ensuite, re-testez-le via: echo 'require("forever")' | node commande de echo 'require("forever")' | node .

  • Modifiez temporairement le dossier actuel à l’emplacement où l’extension a été installée globalement avant d’appeler le script. Par exemple

     npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd - 
  • Configurez la destination d’installation globale dans le fichier npm userconfig (voir: npm help 5 npmrc ) ou par userconfig param ( --prefix ).

    Pour afficher la configuration actuelle, exécutez la npm config list .

    Pour éditer la configuration actuelle, lancez: npm config edit .

  • Spécifiez le chemin complet de l’ emplacement des modules de noeud lors de l’appel de require() . Par exemple

     require("/path/to/sub/module") 
  • Installez le package sur un emplacement personnalisé, par exemple

     npm install forever -g --prefix "$HOME"/.node_modules 

    Cependant, l’installation passera sous ~/.node_modules/lib/node_modules/ , donc l’emplacement doit encore être ajouté.

    Voir: package d’installation local npm vers un emplacement personnalisé

  • Créez un lien symbolique dans le dossier en cours à partir de l’emplacement du package global. Par exemple

     npm link forever 

Vous pouvez mettre cette ligne dans votre fichier .profile :

export NODE_PATH = “$ (npm config get prefix) / lib / node_modules”

Cela fera du node le chemin global.