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 semver
– node_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:
$HOME/.node_modules
(global)
Remarque: $HOME
est le répertoire personnel de l’utilisateur.
$HOME/.node_libraries
(global) $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
Dossier node_modules
actuel. (local)
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
).
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.