J'essaie d'installer globalement, puis d'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 dans le chemin global, mais si j'essaye, require("forever");
j'obtiens une erreur indiquant que le module n'a pas été trouvé.
J'utilise la dernière version de node et npm et je connais déjà le changement que npm a fait dans l'installation globale vs locale, mais je ne veux vraiment pas installer localement sur chaque projet et je travaille sur une plate-forme qui ne le fait pas 't support link
donc 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: Juste pour être clair: je ne veux pas installer localement.
~/.config/yarn/global
pour la laineRéponses:
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:
Remarque: cela dépend de l'endroit où vos modules globaux sont réellement installés.
Voir: Chargement à partir des dossiers globaux .
la source
export NODE_PATH=/usr/local/lib/node_modules
place.NODE_PATH
variable d'environnement surC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
fonctionnera probablement.%AppData%\npm\node_modules
fonctionnera sous Windows 10.NODE_PATH
puis-je utiliser simultanément des modules globaux et locaux?NODE_PATH=$(npm root -g)
Après avoir installé le package globalement, vous devez lier le projet local avec le package global
Voir ici
la source
~/some-stand-alone-random-nodejs-test.js
. Je ne veux pas transformer mon dossier personnel en répertoire de projet. Je ne veux pas créer de nouveaux dossiers pour chaque petite expérience.npm link <module>
Ensuite, vous verrez un raccourci (lien) créé dans le dossier node_module de vos projets faisant référence au module de nœud global.Toutes mes excuses pour la nécromancie, mais je suis en mesure de spécifier des chemins codés en dur vers les modules installés globalement:
Ce n'est pas parfait mais étant donné qu'Unity3d essaie de "compiler" tous les javascript qui sont inclus dans le répertoire du projet, je ne peux vraiment pas installer de packages.
la source
Je sais que c'est une vieille question, mais je suis tombé dessus en essayant de faire une vérification de version en utilisant
semver
unpreinstall
script danspackage.json
. Puisque je savais que je ne pouvais pas dépendre des modules locaux installés, je l'ai utilisé pour exigersemver
dunode_modules
dossier global (car celanpm
dépend de lui, je sais qu'il est là):J'aime cette approche car elle ne nécessite l'installation d'aucun module spécial pour pouvoir l'utiliser.
Je n'ai pas opté pour une
NODE_PATH
solution 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 de démarrernpm install
mon projet.La façon dont cela est codé, il est garanti de ne trouver que les modules de premier niveau (installés à l'aide de
npm install -g ...
) ou les modules requis parnpm
(répertoriés commedependencies
ici: https://github.com/npm/npm/blob/master/package.json ). Si vous utilisez une version plus récente de NPM, il peut trouver des dépendances d'autres packages installés globalement car la structure desnode_modules
dossiers est désormais plus plate .J'espère que cela est utile à quelqu'un.
la source
Selon la documentation , Node.js recherchera par défaut dans les emplacements suivants:
Chemin spécifié dans la
NODE_PATH
variable d'environnement .Remarque:
NODE_PATH
la variable d'environnement est définie sur une liste de chemins absolus séparés par deux-points.node_modules
Dossier actuel . (local)$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-ce que Node.js est configurénode_prefix
.Pour vérifier la valeur actuelle de
node_prefix
, exécutez:Remarque: le préfixe correspond au
--prefix
paramètre lors de la construction et il est relatif àprocess.execPath
. Ne pas confondre avec la valeur de lanpm config get prefix
commande. la sourceSi 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é au moment de l'exécution sauf s'il est remplacé dans lenpmrc
fichier ).Solution
Vous pouvez essayer les solutions de contournement suivantes:
Spécifiez l'emplacement de votre module global dans
NODE_PATH
la variable d'environnement. Par exemplePour tester et imprimer la valeur de
NODE_PATH
, exécutez:Pour une solution plus permanente, liez votre
$HOME/.node_modules
dossier utilisateur global pour qu'il pointe vers le dossier racine, en exécutant cette commande:Puis re-testez-le via:
echo 'require("forever")' | node
commande.Changez temporairement le dossier actuel dans lequel l'extension a été installée globalement, avant d'appeler le script. Par exemple
Configurez la destination d'installation globale dans le
npm
fichier userconfig (voir :)npm help 5 npmrc
ou paruserconfig
param (--prefix
).Pour afficher la configuration actuelle, exécutez:
npm config list
.Pour modifier la configuration actuelle, exécutez:
npm config edit
.Spécifiez le chemin complet de l' emplacement des modules de nœud lors de l'appel
require()
. Par exempleInstallez le package à un emplacement personnalisé, par exemple
Cependant, l'installation se déroulera en panne
~/.node_modules/lib/node_modules/
, l'emplacement doit donc encore être ajouté.Voir: package d'installation local npm vers un emplacement personnalisé
Créez un lien symbolique dans le dossier actuel à partir de l'emplacement du package global. Par exemple
la source
Vous pouvez utiliser le package
requireg
pour résoudre ce problème:fera l'affaire.
En outre, il existe un autre module, bien
global-npm
que spécifique à l'utilisation du globalnpm
, vous pouvez regarder le code court et voir comment la technique fonctionne.la source
NODE_PATH
c'est aussi que vous n'avez pas besoin de changer de code. (mon cas d'utilisation est de noter de nombreux projets d'étudiants, où je ne veux pas exécuternpm install
pour chacun d'eux, et je ne veux pas non plus qu'ils fournissent unnode_modules
répertoire).requireg
en premier lieu, c'est tout le problème.Pour les utilitaires CLI qui dépendent de gros modules, comme
puppeteer
, j'aime créer unnpm root -g
et l'utiliser pour exiger le module global.la source
Vous pouvez mettre cette ligne dans votre
.profile
fichier:Cela
node
utilisera le chemin global.la source
node_modules
. C'est une vieille réponse mais je me souviens que je l'ai eu quelque part dans la documentation. Quoi qu'il en soit, sur mon ordinateur (en 2020), lenode_modules
répertoire global npm estusr/lib/node_modules
. Quoi qu'il en soit, je fais confiancenpm config get prefix
car il est utilisé globalement par npm chaque fois qu'un package global est installé, il devrait donc être correct.package.json
fichier ou dansyarn.lock
/package-lock.json
.node_modules
dossier, puis c'est parent, puis c'est parent, ... jusqu'à ce qu'il trouve unnode_modules
dossier qui contient ce module. Cependant, si vous installez un package globalement, il ne sera dans aucunnode_modules
dossier au-dessus du répertoire actuel du script, vous utilisez donc NODE_PATH comme solution de secours où node recherchera les packages.