Préfixe de chemin global npm

142

Je suis plus prudent que d'habitude parce que j'ai été troublé par le comportement du npmpassé.

Je suis sur un Mac et j'ai installé node.js via brew install node .

Maintenant que je veux exécuter jslint.jssur la ligne de commande en tant que commande, jslintje trouve que la façon canonique d'accomplir cela est de sudo npm install -g jslintfonctionner avec cette sortie:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)

Par la suite

$ jslint ply.js
zsh: command not found: jslint

en raison de /usr/local/share/npm/binne pas être dans mon$PATH .

1) Pourquoi n'a-t-il brewpas installé le npm binchemin global vers le chemin? Peut-être l'a-t-il fait, mais quelque chose zshne fait que le gâcher. Où pourrais-je trouver cela?
2) Dois-je faire ça? (Ajouter :/usr/local/share/npm/binau fichier exporté $PATHen bas de mon~/.zshrc )

Il semble que ce n'est pas la bonne façon de le faire car si j'installe quelque chose d'autre plus tard (en utilisant Homebrew ou quelque chose), je devrai l'ajouter à mon script de démarrage zsh pour définir le chemin. Je suppose que dans ce cas particulier, c'est juste une question denpm install -g ne pas créer les bons liens symboliques dans un emplacement "approprié" (comme /usr/local/binpeut-être).

Je pense que je vais créer manuellement des liens symboliques à l'intérieur /usr/local/bin pour tous les programmes avec lesquels j'ai des problèmes et cela devrait être assez bon pour mes besoins.

ÉDITER : Je mets à jour cela en 2019, car cette vieille question est populaire mais maintenant obsolète à la fois en termes de flux de travail personnel et également en termes de meilleure façon d'installer le nœud et de gérer ses différentes dépendances.

Mon flux de travail personnel consiste maintenant à utiliser le programme d'installation obtenu à partir de nodejs.org pour installer node sur les systèmes. En fait, je fais plus confiance à cela qu'au package homebrew lui-même, car il sait mieux gérer les fichiers. Si vous souhaitez changer votre nœud système de 8.10 à 10.15, que ce soit sur Mac ou Windows, téléchargez simplement le programme d'installation de nodejs.org pour 10.15 pour votre système d'exploitation. Tenter de mettre à niveau le nœud installé via homebrew s'est toujours avéré être une approche plus difficile dans mon expérience.

En outre, la chose la plus importante à souligner est que l'utilisation de sudo comme indiqué dans mon exemple d'installation npm de jslint ci-dessus est fortement déconseillée; Je suis à peu près certain que les packages homebrew ne doivent jamais être installés ou interagis avec le superutilisateur. Cela ne devrait pas être nécessaire et entraînera des maux de tête pour les autorisations de fichiers!

De plus, je recommande ESLint plutôt que jslint, et je n'ai pas utilisé jslint depuis des années.

Steven Lu
la source
Merci, ils sont réparés maintenant. Je ne suis généralement pas si imprudent, mais j'ai tapé cette question très rapidement
Steven Lu
@DaveNewton Je fais généralement ça, ouais. Cette question était vraiment bâclée, mais c'est l'une de mes plus populaires.
Steven Lu
n'est-il pas plus facile de copier du texte qu'une capture d'écran? de toute façon corrigé.
1
@ saleemrashid1 ​​Hé, je voulais faire ça. L'avez-vous vraiment lu et copié? Merci.
Steven Lu
3
Oui! De rien. Je travaille sur un jeu et en attendant que NPM télécharge des trucs, je l'ai fait!

Réponses:

308

Extension de votre PATHavec:

export PATH=/usr/local/share/npm/bin:$PATH

n'est pas une mauvaise idée. Cela dit, vous ne devriez pas avoir à le faire.

Lance ça:

npm config get prefix

La valeur par défaut sur OS X est /usr/local, ce qui signifie que npm établira un lien symbolique vers les binaires /usr/local/bin, qui devraient déjà être sur votrePATH (surtout si vous utilisez Homebrew).

Alors:

  1. npm config set prefix /usr/local si c'est autre chose, et
  2. Ne pas utiliser sudoavec npm! Selon la documentation jslint , vous devriez juste pouvoir le faire npm install.

Si vous avez installé npm en tant que sudo ( sudo brew install), essayez de le réinstaller avec plain ol ' brew install. Homebrew est censé vous aider à rester sudolibre.

Trevor Burnham
la source
1
Merci! npmrefuse d'installer jslintglobalement, cependant. npm install -g jslintéchoue. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu
2
N'aurais-je pas besoin de le faire chown /usr/localsi je veux que des scripts y écrivent des liens sans exiger sudo? Que diriez-vous de suivre ceci pour configurer nom / node ~/.localou quelque chose?
Steven Lu
2
DOUX! Je suis allé défaire les différents répertoires déposés par l'utilisateur rootdans mon ~/répertoire (parsudo rm -r le tmp/et a .npm/), puis un npm install -g jslinta fonctionné à merveille. C'est bien que npm lui-même soit un programme de nœuds et soit un peu une preuve de concept en ligne de commande JS pour moi que je commence à apprécier maintenant que je le comprends un peu mieux.
Steven Lu
2
@StevenLu Oui, chown-ing /usr/localet tout ce qu'il contient est une pratique courante sur OS X. Voir le dépannage page de sur le wiki Homebrew.
Trevor Burnham
Ouais, il semble que le chowning de /usr/locals'est déjà produit sur ma machine sinonnpm et les autres fonctionner sans sudone pourraient pas déposer de liens dans, /usr/local/bin/etc.
Steven Lu
8

J'ai passé un certain temps sur ce problème et le commutateur PATH n'aidait pas. Mon problème était le bogue Homebrew / node / npm trouvé ici - https://github.com/npm/npm/issues/3794

Si vous avez déjà installé le nœud en utilisant Homebrew, essayez **** Notez par commentaires que cela peut ne pas être sûr. Cela a fonctionné pour moi, mais pourrait avoir des conséquences inattendues. Il semble également que la dernière version de Homebrew installe correctement npm. Donc , probablement que je voudrais essayer brew update, brew doctor, brew upgrade nodeetc avant d' essayer ****:

npm update -gf

Ou, si vous souhaitez installer node avec Homebrew et faire fonctionner npm, utilisez:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh
YPCrumble
la source
3
Recommander par hasard aux gens de forcer une mise à jour dans le monde n'est pas une bonne idée.
toxaq
1
Suivre aveuglément les conseils de quelqu'un sur Internet n'est pas une bonne idée.
Volte
La méthode force sur -gf l'a fait pour moi. Je vous remercie.
MEM
5

J'utilise brew et le préfixe était déjà défini sur:

$ npm config get prefix
/Users/[user]/.node

J'ai remarqué que le dossier bin et lib appartenaient à root, ce qui empêchait l'installation habituelle non sudo, donc je les ai restitués à l'utilisateur

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

Ensuite, je viens d'ajouter le chemin d'accès à mon .bash_profile qui se trouve dans / Users / [user]

PATH=$PATH:~/.node/bin
Greg
la source
3

brew ne devrait pas vous obliger à utiliser sudo même lorsque vous exécutez npm avec -g. Cela pourrait en fait créer plus de problèmes sur la route.

Typiquement, brew ou port vous permet de mettre à jour votre chemin afin de ne pas risquer de gâcher votre .zshrc, .bashrc, .cshrc, ou toute autre saveur de shell que vous utilisez.

Pascal Belloncle
la source
En effet Brew ne nécessite pas et déconseille l'utilisation de sudo. J'utilisais sudo npm(parce que quelque chose que j'ai lu me l'a dit). Je suis curieux de savoir où chercher comment le chemin est tracé. Il semble en fait que le programme d' zshinstallation exécute quelque chose qui finit par coder en dur le chemin (au moment de l'installation de zsh) dans le .zshrcque je n'aime pas tellement
Steven Lu
Tout ce qui est installé par npm doit être installé dans /usr/local. L' /usrespace de noms du chemin est réservé aux packages officiels de votre distribution. /usr/local/bindans votre $ PATH ou non, est un problème zsh.
Floby
les scripts de brassage n'ajoutent rien à votre script de démarrage, c'est quelque chose que vous devez faire. voir madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x pour un exemple.
Pascal Belloncle
2

J'ai réussi à corriger l'erreur de commande Vue Cli no en procédant comme suit:

  • Dans le terminal sudo nano ~/.bash_profilepour modifier votre profil bash.
  • Ajouter export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Enregistrer le fichier et redémarrer le terminal
  • Vous devriez maintenant pouvoir utiliser vue create my-projectet vue --versionetc.

Je l'ai fait après avoir installé le dernier Vue Cli de https://cli.vuejs.org/

J'utilise généralement du fil, mais je l'ai installé globalement avec npm npm install -g @vue/cli. Vous pouvez aussi utiliser du fil si vous le souhaitezyarn global add @vue/cli

Remarque: vous devrez peut-être d'abord le désinstaller globalement si vous l'avez déjà installé: npm uninstall -g vue-cli

J'espère que cela t'aides!

Mark Fasel
la source
1
Cela a essentiellement fonctionné pour moi. J'ai dû l'ajuster pour exporter PATH = $ PATH: / Users / [your username] /node_modules/.bin
Mike Carpenter
0

Essayez de courir:

PATH=$PATH:~/npm/bin

puis faites un test en exécutant expressdans la ligne de commande. Cela a fonctionné pour moi.

kiko carisse
la source
assez sûr que vous voulez dire ~/.npm/binou un tel. il ne devrait pas y avoir de npmrépertoire ajouté à votre répertoire personnel.
Steven Lu
0

Si vous avez lié les packages de nœuds à l'aide de la commande sudo

Accédez ensuite au dossier où les node_modules sont installés globalement.

Sur les systèmes Unix, ils sont normalement placés dans / usr / local / lib / node ou / usr / local / lib / node_modules lorsqu'ils sont installés globalement. Si vous définissez la variable d'environnement NODE_PATH sur ce chemin, les modules peuvent être trouvés par nœud.

Windows XP -% USERPROFILE% \ Application Data \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

puis exécutez la commande

ls -l

Cela donnera la liste de tous les node_modules globaux et vous pourrez facilement voir les modules de nœuds liés.

autodidacte91
la source
0

sudo brew n'est plus une option, donc si vous installez avec brew à ce stade, vous obtiendrez 2 choses vraiment désagréables: A: il aime s'installer dans /usr/local/optsou selon ceci, / usr / local / shared. Ce n'est pas un gros problème au début, mais j'ai eu des problèmes avec le nœud PATH, en particulier lorsque j'ai installé lint. B: vous êtes en quelque sorte coincé avec les commandes sudo jusqu'à ce que vous le désinstalliez et l'installiez de cette façon ou que vous puissiez obtenir la pile de Bitnami

Je recommande cette méthode par rapport à l'option stack car elle est prête à l'emploi si vous avez plusieurs projets. Si vous optez pour la pile MEAN prédéfinie, vous devrez configurer des hôtes virtuels dans httpd.conf (plus pénible dans cette pile que XAMPP) plus la mise à jour habituelle de votre extra / vhosts.conf et / etc / hosts pour chaque projet, à moins que vous ne souhaitiez rediriger et redémarrer votre serveur une fois la mise à jour terminée.

ange
la source
0

La solution simple est ...

Mettez simplement la commande ci-dessous:

  1. sudo npm config get prefix

    si ce n'est pas quelque chose comme ça /usr/local, vous devez le réparer en utilisant la commande ci-dessous.

  2. sudo npm config set prefix /usr/local...

Maintenant ça marche à 100%

Yogesh Kumar
la source
Je recommande vivement d'éviter sudo avec npm. Voir ma modification.
Steven Lu