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_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. -
courant
node_modules
le dossier. (local) -
$HOME/.node_modules
(global)Note:
$HOME
est le répertoire personnel de l'utilisateur. -
$HOME/.node_libraries
(mondiale) -
$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 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" 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 paruserconfig
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
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.