npm lève une erreur sans sudo

1288

Je viens d'installer node et npm via le package sur nodejs.org et chaque fois que j'essaie de rechercher ou d'installer quelque chose avec npm, il génère l'erreur suivante, sauf si je lance la commande. J'ai le sentiment qu'il s'agit d'un problème d'autorisations? Je suis déjà administrateur.

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0
Tchad
la source
35
Veuillez considérer la solution utilisant NVM : stackoverflow.com/a/24404451/1480391 (au lieu de pirater avec des autorisations)
Yves M.
2
@janaspage Vous ne pouvez pas installer de nœud ou NVM (Node Version Manager) via NPM (Node Package Manager), ce n'est pas logique. NPM vient dans le nœud (il est installé en même temps). Jetez un œil à la page Wikipedia: en.wikipedia.org/wiki/Npm_(software)
Yves M.
5
Enfin une solution meilleure que sudo chown: github.com/sindresorhus/guides/blob/master/…
Dmitri Zaitsev
Sous OSX et en installant le nœud avec l'installateur 0official pkg, cette solution ne fonctionnait pas. J'ai utilisé celui-ci à la place: stackoverflow.com/a/34968008/675565
fmquaglia
2
Il explique le problème et le correctif: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Réponses:

2269

Cela ressemble à un problème d'autorisations dans votre répertoire personnel. Pour récupérer la propriété du répertoire .npm , exécutez:

sudo chown -R $(whoami) ~/.npm
Noé
la source
102
Je pensais que whoamic'était un espace réservé, mais cela fonctionne typé littéralement tel quel, donc ce doit être une variable que je ne comprends pas.
SimplGy
127
whoami est une véritable commande shell en.wikipedia.org/wiki/Whoami . Les contre-coups permettent de whoamis'assurer qu'il est exécuté correctement puis placé dans la commande chown
Noah
13
vous pouvez également spécifier manuellement votre nom d'utilisateur. Si votre nom d'utilisateur est "simpleascouldbe", la commande seraitsudo chown -R simpleascouldbe ~/.npm
Noah
13
npm n'exige PAS et vous ne devez pas utiliser sudo - voir la réponse ci-dessous @HeberLZ en particulier sa 2e option concernant: ./configure --prefix = xxxxxx
Scott Stensland
9
@ChristopherWill: Cela ne change pas la propriété d'un répertoire système. Cela modifie la propriété des répertoires dans le répertoire de base de l'utilisateur, qui devrait appartenir à l'utilisateur.
user4815162342
620

Autorisations que vous avez utilisé lors de l' installation de nœud sera nécessaire lors de faire des choses comme l' écriture dans votre répertoire NPM ( npm link, npm install -g, etc.).

Vous avez probablement exécuté l'installation de noeud avec des autorisations root, c'est pourquoi l'installation du package global vous demande d'être root.


Solution 1: NVM

Ne piratez pas avec les autorisations, installez le nœud de la bonne façon.

Sur une machine de développement, vous ne devez pas installer et exécuter le nœud avec des autorisations root, sinon des choses comme npm link, npm install -gauront besoin des mêmes autorisations.

NVM (Node Version Manager) vous permet d'installer Node sans autorisations root et vous permet également d'installer de nombreuses versions de Node pour jouer facilement avec elles. Parfait pour le développement.

  1. Désinstaller le nœud (l'autorisation root sera probablement requise). Cela pourrait vous aider.
  2. Installez ensuite NVM en suivant les instructions de cette page .
  3. Installez Node via NVM: nvm install node

Désormais npm link, vous npm install -gn'aurez plus besoin d'être root.

Modifier: Voir également https://docs.npmjs.com/getting-started/fixing-npm-permissions


Solution 2: installer des packages globalement pour un utilisateur donné

Ne piratez pas avec les autorisations, installez les packages npm globalement dans le bon sens.

Si vous êtes sous OSX ou Linux, vous pouvez créer un répertoire dédié à l'utilisateur pour votre package global et votre configuration npmet nodesavoir comment trouver des packages installés globalement.

Consultez cet excellent article pour obtenir des instructions étape par étape sur l'installation des modules npm dans le monde sans sudo.

Voir aussi: la documentation de npm sur la correction des autorisations npm .

Yves M.
la source
32
De toutes les solutions publiées, la solution NVM ici a fourni les meilleurs résultats pour moi. Je recommande vivement d'utiliser NVM plutôt que de jouer avec des autorisations.
wenincode
9
Ces instructions ont très bien fonctionné. Cependant, vous voudrez probablement supprimer les modules que vous avez installés avec sudo avant de désinstaller nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- J'ai dû réinstaller nodejs et dans un shell root et les désinstaller, sinon vous continuerez d'avoir des liens symboliques vers yo, grunt, etc…
Bruno Flávio
4
C'est la meilleure solution, j'ai supprimé tous les modules en faisant d'abord sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157 , puis supprimé npmet installé vianvm
Fabio Antunes
3
Pour les instructions de désinstallation pour le nœud, utilisez cette réponse SO stackoverflow.com/a/11178106/480031
seangates
3
Pourquoi est-il acceptable d'utiliser root pour installer le nœud sur une machine de production?
Bruno Peres
401

Vous aurez également besoin de la permission d'écriture dans le node_modulesrépertoire:

sudo chown -R $USER /usr/local/lib/node_modules
Xilo
la source
7
Ainsi que le ~/tmprépertoire pour moi.
knownasilya
123
Je ne sais pas pourquoi cela suscite toujours des votes positifs. C'est une très mauvaise pratique de changer la propriété des répertoires système pour un utilisateur particulier! Veuillez consulter la réponse ci-dessous pour d'autres solutions (comme la création d'un groupe distinct pour les utilisateurs de nœuds).
Christopher Will
1
Je n'ai pas node_modulesdans /usr/local/lib/. wtf?
Connor Leech
27
Quoi que vous fassiez - ABSOLUMENT ne lancez pas 'sudo chmod -R whoami' sur / usr / local / lib ou / usr / lib / vous ruinerez votre fichier sudoers et vous vous détesterez.
qodeninja
7
tout le monde, s'il vous plait, votez ceci ... Then I ran sudo chown -R $USER /* and everything was fine- NON - vous ruinez votre machine.
commonpike
75

Changer le propriétaire des dossiers "global du système" est un hack. Lors d'une nouvelle installation, je configurerais NPM pour utiliser un emplacement déjà accessible en écriture pour les programmes "utilisateur global":

npm config set prefix ~/npm

Assurez-vous ensuite d'ajouter ce dossier à votre chemin:

export PATH="$PATH:$HOME/npm/bin"

Voir la réponse de @ErikAndreas aux modules NPM ne s'installera pas globalement sans sudo et un guide étape par étape plus long de @sindresorhus avec également des sets .$MANPATH

Joel Purra
la source
Je suis tout à fait d'accord, sauf que je suggère que si vous définissez simplement le préfixe, $HOMEvotre .profilescript se chargera généralement de $PATHla prochaine fois que vous le sourcez (par exemple, la prochaine fois que vous vous connectez).
Jess Austin
@JessAustin: Peut-être, mais cela vous apportera également plus d'encombrement $HOMEet pourrait interférer avec d'autres (futurs?) Fichiers / sous-dossiers NPM. Préférez garder les binaires de différents gestionnaires de packages / langues / systèmes de construction séparés et définis explicitement $PATH(dans un script de temps de connexion) à la place.
Joel Purra
Eh, encombrement? Nous parlons simplement des modules installés à l'échelle mondiale dans ~/lib/node_modules, avec leur CLI associée, le cas échéant, dans ~/bin. Pour de nombreux utilisateurs, surtout si elles n'ont pas racine, à la fois ~/binet ~/libexistent déjà.
Jess Austin
@JessAustin: c'est aussi une question de collisions de noms pour les bibliothèques et les binaires. Disons que vous indiquez à NPM de mettre des binaires ~/bin, puis faites de même pour un ou deux gestionnaires de packages supplémentaires. Cela pourrait ne pas se produire aujourd'hui ou demain, mais il y a un risque clair que deux packages provenant de différents gestionnaires se heurtent à un nom et se remplacent mutuellement les fichiers. C'est un assez bon cas pour moi d'avoir des préfixes séparés. (Des exemples concrets seraient appréciés.)
Joel Purra
1
Cela devrait être accepté comme la meilleure réponse. La modification des dossiers globaux du système peut être dangereuse.
Vladimir Marton
58

Je l'ai rencontré lors de l'installation de Recess ( https://github.com/twitter/recess ) pour compiler mon CSS pour Bootstrap 3.

Lors de l'installation de la niche:

-npm install recess -g
  1. Vous devez déverrouiller les autorisations dans votre homerépertoire, comme le dit Noah :

    sudo chown -R `whoami` ~/.npm
  2. Vous avez également besoin d'autorisations d'écriture dans le node_modulesrépertoire, comme le dit Xilo , donc si cela ne fonctionne toujours pas, essayez:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Si vous voyez toujours des erreurs, vous devrez peut-être également corriger les /usr/localautorisations :

    sudo chown -R `whoami` /usr/local

Veuillez noter que, comme indiqué dans cet article, ce /usr/local/ n'est pas un répertoire système si vous êtes sur un Mac, donc cette réponse est en fait parfaitement "sûre" pour les utilisateurs de Mac. Cependant, si vous êtes sous Linux, consultez la réponse de Christopher Will ci-dessous pour une solution multi-utilisateur conviviale, sûre pour le système (mais plus complexe).

danomarr
la source
35
C'est une mauvaise idée. Vous ne voulez probablement pas que les répertoires système appartiennent à un utilisateur particulier. Outre de graves problèmes de sécurité, ce n'est pas non plus compatible avec plusieurs utilisateurs.
Christopher Will
2
Oui mais c'est une excellente solution pour un environnement de développement +2, surtout si vous avez déjà installé node.js et qu'il vous suffit de continuer à basculer!
elliotrock
Vous ne devriez vraiment pas posséder de packages en dehors de votre répertoire personnel
Ben
1
S'il ne se trouve pas dans votre dossier personnel, il s'agit d'un répertoire système, malgré toute affirmation contraire. Ce n'est pas parce qu'il n'est pas utilisé par OS X que ce n'est pas un répertoire système.
remer riche
53

Fais attention!!! Fais attention!!! Fais attention!!!

chown ou chmod n'est PAS la solution, à cause du risque de sécurité.

Au lieu de cela, faites:

Vérifiez d'abord où pointent npm, si vous appelez:

npm config get prefix

Si / usr est renvoyé, vous pouvez effectuer les opérations suivantes:

mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin

Cela crée un répertoire npm dans votre répertoire personnel et pointez npm dessus.

Pour que ces modifications soient permanentes, vous devez ajouter la commande d'exportation à votre .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
suther
la source
dois-je passer à l'option 2 uniquement si j'ai / usr?
Albert Laure
3
Notez que la dernière commande génère en fait le contenu de $PATH, pas la chaîne elle-même. Tu devrais changer ça.
Veluria
1
Cela l'a corrigé! Je vous remercie.
J'obtenais
1
C'est la meilleure réponse. C'est la méthode recommandée pour résoudre le problème.
Paulo Coghi - Reinstate Monica
Pourquoi le risque de sécurité présente-t-il un risque?
Frank
40

D'autres réponses suggèrent de changer la propriété ou les autorisations des répertoires système pour un utilisateur spécifique. Je déconseille fortement de le faire, cela peut devenir très gênant et peut gâcher tout le système!

Voici une approche plus générique et plus sûre qui prend également en charge plusieurs utilisateurs.

Créez un nouveau groupe pour les utilisateurs de noeud et ajoutez les utilisateurs requis à ce groupe. Définissez ensuite la propriété des fichiers / répertoires dépendants du nœud sur ce groupe.

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

Maintenant, vous pouvez facilement installer vos modules en tant qu'utilisateur

npm install -g generator-angular

Certains modules (grunt, bower, yo etc.) devront toujours être installés en tant que root. C'est parce qu'ils créent des liens symboliques dans / user / bin /.

Éditer

3 ans plus tard, je recommanderais d'utiliser Node Version Manager . Cela vous évite beaucoup de temps et d'ennuis.

Christopher Will
la source
2
Si le nœud est installé par les sources, bien que le multi-utilisateur soit un problème, tous les modules fonctionneraient parfaitement sans l'utilisation de sudo. Ceci est également très important car dans le cas du module yeoman, les gens ne peuvent pas mettre à jour les générateurs via sudoing l'application yeoman car il ne permet pas l'exécution de sudo :(
HeberLZ
1
Sous Linux, j'utilise généralement le groupe intégré staffpour accorder des autorisations à mes dossiers de développement. En outre, c'est une bonne idée de s'exécuter chmod g+ws node_modulespour vous assurer que votre groupe dispose d'une autorisation de lecture / écriture.
jackvsworld
@jackvsworld Je ne connaissais pas le groupe du personnel. Je suppose que ce serait une solution plus fluide, car il ne faut pas créer un nouveau groupe fictif .. bien que ce soit moins explicite. Mais merci pour cette entrée.
Christopher Will
D'une manière générale, /usr/libest sous le contrôle de votre gestionnaire de packages système et vous ne devez y apporter aucune modification.
remer riche
23

La documentation officielle sur la façon de corriger les npm installautorisations avec une EACCESerreur se trouve à https://docs.npmjs.com/getting-started/fixing-npm-permissions .

J'ai rencontré ce problème après une nouvelle installation du nœud à l'aide du programme d' .pkginstallation sur OSX. Il y a d'excellentes réponses ici, mais je n'ai pas encore vu de lien vers npmjs.com.

Option 1: modifier l'autorisation du répertoire par défaut de npm

  1. Trouvez le chemin vers le répertoire de npm:

    npm config get prefix

Pour de nombreux systèmes, ce sera / usr / local .

AVERTISSEMENT : si le chemin affiché est juste / usr , passez à l' option 2 .

  1. Remplacez le propriétaire des répertoires de npm par le nom de l'utilisateur actuel (votre nom d'utilisateur!):

    sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

    Cela modifie les autorisations des sous-dossiers utilisés par npm et certains autres outils ( lib / node_modules , bin et share ).

Option 2: remplacer le répertoire par défaut de npm par un autre répertoire

Il y a des moments où vous ne voulez pas changer la propriété du répertoire par défaut que npm utilise (c'est-à - dire / usr ) car cela pourrait causer des problèmes, par exemple si vous partagez le système avec d'autres utilisateurs.

Au lieu de cela, vous pouvez configurer npm pour utiliser un répertoire différent. Dans notre cas, ce sera un répertoire caché dans notre dossier d'accueil.

  1. Créez un répertoire pour les installations globales:

    mkdir ~/.npm-global
  2. Configurez npm pour utiliser le nouveau chemin de répertoire:

    npm config set prefix '~/.npm-global'
  3. Ouvrez ou créez un fichier ~ / .profile et ajoutez cette ligne:

    export PATH=~/.npm-global/bin:$PATH
  4. De retour sur la ligne de commande, mettez à jour vos variables système:

    source ~/.profile
HoppyKamper
la source
1
Merci, celui-ci a fonctionné pour moi comme le soludion chown n'a pas fonctionné. Tu m'as sauvé.
fmquaglia
dois-je passer à l'option 2 uniquement si j'ai / usr?
Albert Laure
J'adore l'option 2 de cette réponse. (1) Il n'a pas les failles de sécurité de l'utilisation de sudo, (2) il préserve l'architecture pour les autres utilisateurs, (3) il référence la documentation, ET (4) il a la ligne de commande nécessaire entrées incluses. Merci pour l'ajout!
Tom Rose
Alors, que se passe-t-il lorsque vous installez quelque chose avec un lien symbolique /usr/bin/? Maintenant, seul votre utilisateur peut y accéder. Vous vous connectez en tant que quelqu'un d'autre, toujours pas d'accès, car les fichiers sont en fait dans le répertoire personnel d'un autre utilisateur!
Frans
Bien, celui-ci a fonctionné pour moi. Merci pour l'explication en plus des commandes.
FrankByte.com
12

Comme si nous avions besoin de plus de réponses ici, mais de toute façon ..

Sindre Sorus a un guide Installer les packages npm dans le monde sans sudo sur OS X et Linux décrivant comment installer proprement sans jouer avec les autorisations:

Voici un moyen d'installer des packages globalement pour un utilisateur donné.

  1. Créez un répertoire pour vos packages globaux

    mkdir "${HOME}/.npm-packages"
  2. Référencez ce répertoire pour une utilisation future dans votre .bashrc / .zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Indiquez à npm où stocker votre package installé à l'échelle mondiale. Dans votre $HOME/.npmrcfichier, ajoutez:

    prefix=${HOME}/.npm-packages
  4. Assurez-vous que le nœud les trouvera. Ajoutez ce qui suit à votre .bashrc / .zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Assurez-vous que vous trouverez les binaires installés et les pages de manuel. Ajoutez ce qui suit à votre .bashrc/ .zshrc:

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

Consultez npm-g_nosudo pour effectuer automatiquement les étapes ci-dessus

Consultez la source de ce guide pour les dernières mises à jour.

ptim
la source
2
tx pour l'édition @AndyHayden :) Ma méthode préférée est suggérée dans les commentaires ci-dessus: utilisez NVM! stackoverflow.com/a/24404451/1480391
ptim
La seule solution qui a fonctionné pour moi qui n'implique pas de fouiner avec des autorisations. Je déteste NPM et sa stupidité de permissions idiotes. Merci pour la solution!
RyanNerd
8

TL; DR

utilisez toujours sudo -iou sudo -Hlors de l'exécution npm installpour installer des packages globaux.

-

Lorsque vous l'utilisez, npmil télécharge des packages dans votre répertoire personnel. Lorsque vous exécutez en tant que sudo,npm installe les fichiers dans le même répertoire, mais maintenant ils appartiennent à root.

C'est donc ce qui arrive à absolument chaque personne qui a déjà utilisé npm:

  • installer des packages locaux sans problème en utilisant npm install foo
  • installer le package global en utilisant sudo install -g foo-clisans problème
  • tenter d'installer le package local avec npm install bar
  • être frustré par les npmconcepteurs maintenant que vous devez à nouveau consulter chmodun répertoire

Lorsque vous utilisez l' option -iou -Havec sudo, votre répertoire personnel sera le rootrépertoire personnel de. Toutes les installations globales mettront les packages en cache au /root/.npmlieu des rootfichiers appartenant à /home/me/.npm.

Utilisez toujours sudo -iou sudo -Hlors de l'exécution npm installpour installer des packages globaux et vos npmproblèmes d'autorisations disparaîtront.

Pour de bon.

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

- qv la réponse acceptée pour la fixation d'un déjà baisé npm.

riche souvenir
la source
solution la meilleure et la plus simple
Manjeet Singh
6

J'ai eu un problème similaire lorsque les modules NPM ne s'installent pas globalement sans sudo , le problème était que lorsque j'ai installé le nœud, je l'ai fait avec sudo via chris / lea ppa repo .

Ma solution était de désinstaller le nœud et de l'installer de cette façon:

Téléchargez les dernières sources de nœuds stables à partir de nodejs.org #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #enter dossier non compressé

sudo chown $ USER -R / usr / local

./configure --prefix = / usr / local && make && make install

PD: Si vous ne voulez pas changer la propriété du dossier / usr / local, vous pouvez l'installer quelque part que vous possédez déjà. Le problème de cette approche est que vous devrez lier le dossier d'installation avec la ligne de commande bash afin que nous puissions utiliser la commande node plus tard

mkdir ~ / opt

./configure --prefix = ~ / opt && make && make install

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile ou ~ / .bash_profile ou ~ / .zshenv selon le système d'exploitation actuel

Avec l'une ou l'autre de ces approches, vous pourrez effectuer les opérations suivantes sans utiliser sudo

npm install -g module_to_install

HeberLZ
la source
1
J'ai fini par utiliser cette méthode. A utilisé sudo chown $USER /use/localavant la construction. Ça a l'air bien jusqu'à présent, il est temps d'essayer de construire un atome! Merci!
prasanthv
6

Lorsque vous exécutez npm install -g somepackage, vous pouvez obtenir une erreur EACCES vous demandant de réexécuter la commande en tant que root / Administrateur. C'est un problème d'autorisations.

C'est facile à réparer , ouvrez votre terminal (Applications> Utilitaires> Terminal)

sudo chown -R $USER /usr/local/lib/node_modules

** Je vous recommande fortement de ne pas utiliser la gestion des paquets avec sudo (sudo npm -g installer quelque chose), car vous pouvez avoir des problèmes plus tard **

Référence: http://foohack.com/2010/08/intro-to-npm/

Juancarlos Rodríguez
la source
Yay! celui-ci me l'a fait! après avoir fait les autres autres celles ci - dessus: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libet
Regis Zaleman
8
Cela peut entraîner des problèmes d'autorisations avec de nombreuses autres applications, je vous suggère donc de ne pas le faire. Pourquoi échanger une boîte de vers contre une autre?
Brad Parks
1
Ou au moins affinez-le dans / usr / local / lib / node_modules.
Ken
Ceci, ceci et plus encore. Après m'être cogné la tête contre un mur, cela a fait l'affaire. +1
dashard
C'était mon problème. Sur un nouveau macbook (os x 10.10.3), les autorisations sur / usr / local / lib / node_modules étaient: $ ll / usr / local / lib / node_modules total 0 drwxr-xr-x 3 24561 roue 102B 31 mars 18:19 . drwxrwxr-x 4 24561 admin 136B 31 mars 18:19 .. drwxr-xr-x 26 65534 staff 884B 13 avr. 10:53 npm
tkane2000
5

Pour Mac (adopté à partir de la réponse de Christoper Will)

Mac OS X 10.9.4

  1. Préférences système> Utilisateurs et groupes> (déverrouiller)> appuyez sur +:

    Nouveau compte>
    Nom du compte "Groupe" : nodegrp

    Après avoir créé le groupe, cochez l'utilisateur à inclure dans ce groupe

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / node
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): nodegrp ~ / .npm

ken
la source
1
J'ai dû changer quelques chemins vers / usr / local / bin mais à part ça, cette solution fonctionnait très bien sur ma machine OX X 10.9 - merci!
splig
Mauvaise pratique pour changer la propriété des répertoires système.
remer riche
@richremer Je pense que cela dépend de ce que vous essayez de réaliser. si le dossier n'est à l'origine accessible que par le sudoer, il ne peut être modifié que de cette manière. nous limitons la modification au dossier lié à npm. Serait-il plus sûr de continuer à faire sudoou de changer la propriété de ces groupes de dossiers afin qu'elle puisse être modifiée par un utilisateur normal? Si l'utilisateur normal n'est pas censé effectuer aucune action sur ce dossier, il ne faut bien sûr pas modifier la propriété du groupe du dossier.
ken
La chose appropriée à faire est d'installer des packages globaux avec sudo, mais faites-le avec l' -Hindicateur. Plus précisément, sudo -H npm install -g <pkg>. Cela garantit une délimitation correcte des autorisations pour les dossiers système et utilisateur. Ce que vous ne voulez pas faire, c'est utiliser sudo npm install -g, car cela installe les fichiers appartenant à root dans votre répertoire utilisateur. Ce serait génial si npm était assez intelligent pour le faire de la bonne façon, mais ce n'est pas le cas, vous devez donc utiliser le -Hdrapeau sudo pour installer correctement à l'échelle mondiale.
remer riche
4

Dans mon cas, c'est à cause de l'autorisation de ~ / tmp, donc je fais:

sudo chown -R $USER ~/tmp

Et c'est OK!

bnPYSse
la source
4

Pour moi, exécutez seulement

sudo chown -R $(whoami) ~/.npm

ne fonctionne pas. Ensuite, j'exécute aussi

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

Et tout fonctionne bien!

user3753202
la source
Vous êtes très génial monsieur :)
user805981
Les fichiers dans /usr/libsont des fichiers système et ne doivent pas appartenir à votre compte d'utilisateur personnel.
remer riche
4

PROBLÈME : vous (l'utilisateur) n'avez pas le bon ensemble d'autorisations pour le répertoire.

La solution immédiate consiste à exécuter l'installation de npm à l'aide de sudo, mais cela peut vous donner la même erreur ou une mauvaise installation.

ET changer la propriété du répertoire n'est pas une bonne option, un correctif temporaire.


Solution / Suggestion : changer le répertoire par défaut de npm (à partir des documents officiels )

Sauvegardez votre ordinateur avant d'avancer.

(facultatif) Si vous avez une installation erronée, désinstallez-la d'abord:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. Créez un répertoire pour les installations globales:

    mkdir ~/.npm-global

  2. Configurez npm pour utiliser le nouveau chemin de répertoire:

    npm config set prefix '~/.npm-global'

  3. Ouvrez ou créez un fichier ~/.profileou ~/.bash_profileet ajoutez cette ligne:

    export PATH=~/.npm-global/bin:$PATH

  4. De retour sur la ligne de commande, mettez à jour vos variables système ou redémarrez le terminal:

    source ~/.profile

  5. (facultatif) Test: téléchargez un package globalement sans utiliser sudo.

    npm install -g jshint

Nabeel Ahmed
la source
3

Au cas où sudo chown -R $(whoami) ~/.npm cela ne fonctionnerait pas pour vous, ou si vous avez besoin d'une solution de commande non terminale.

Le problème est que votre compte d'utilisateur n'a pas l'autorisation d'écriture dans le dossier node_modules, vous pouvez donc effectuer les opérations suivantes

  1. Ouvrez le Finder et appuyez sur cmd+ shift+ gcela ouvrira le dossier avec l'URL

  2. Écrivez le chemin suivant /usr/local/lib/node_moduleset appuyez sur go

  3. Faites un clic droit sur le node_modulesdossier et choisissezGet Info

  4. Faites défiler jusqu'à la sharing & permissionssection

  5. Déverrouillez pour pouvoir apporter des modifications.

  6. Appuyez +et ajoutez votre compte utilisateur

  7. Assurez-vous que vous choisissez Read & Writedans la liste déroulante des privilèges

Vous devriez maintenant pouvoir installer des packages sans sudoet les problèmes d'autorisation devraient être résolus

Amr Labib
la source
3

Problème: vous n'êtes pas autorisé à écrire dans les répertoires que npm utilise pour stocker les packages et commandes globaux.

Solution: autorisez l'autorisation pour npm.

Ouvrez un terminal:

commande + barre d'espace puis tapez 'terminal'

Entrez cette commande:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Remarque: cela nécessitera votre mot de passe.

Cette solution permet l'autorisation de SEULEMENT les répertoires nécessaires, en gardant les autres répertoires agréables et sûrs.

Mat
la source
Downvoting parce que définir la propriété utilisateur des dossiers système est un anti-modèle et cela ne tient pas compte de cela. Dans le cas spécial qui npm config get prefixrenvoie quelque chose dans le dossier de base, cette solution corrigera les autorisations, mais ne résout pas le problème sous-jacent d'installation de packages globaux de manière sûre pour un environnement partagé.
remer riche
Cela réécrira les autorisations d'une grande partie du système d'exploitation. L'exécution de ceci dans Ubuntu, par exemple, rendra la commande "sudo" elle-même inutilisable.
Sahand Seifi
2

Un autre grand correctif ici pour configurer correctement NPM, exécutez les commandes suivantes:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
Guillaume Le Mière
la source
2

vous pouvez essayer cela, fonctionne sur ubuntu et mac

sudo chown -R $(whoami) /usr/local/lib/node_modules
Adeojo Emmanuel IMM
la source
1
J'ai couru cela et travaillé à 100% pour moi sur un mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya
1

Ce qui me semble être la meilleure option est celle suggérée dans la documentation de npm , qui est de vérifier d'abord où les node_modules globaux sont installés par défaut en exécutant npm config get prefix. Si vous obtenez, comme je le fais sur Trusty,/usr vous voudrez peut-être le changer en un dossier que vous pouvez posséder en toute sécurité sans gâcher les choses comme je l'ai fait.

Pour ce faire, choisissez ou créez un nouveau dossier dans votre système. Vous voudrez peut-être l'avoir dans votre répertoire personnel ou, comme moi, sous /usr/localpour plus de cohérence, car je suis également un utilisateur Mac (je préfère ne pas avoir besoin de regarder dans des endroits différents en fonction de la machine devant laquelle je me trouve). Une autre bonne raison de le faire est le fait que le /usr/localdossier est probablement déjà dans votre PATH (sauf si vous aimez jouer avec votre PATH), mais il est probable que votre dossier nouvellement créé ne soit pas et vous devrez l'ajouter à la Parcourez- vous sur votre profil .bash ou votre fichier .bashrc .

Pour faire court, j'ai changé l'emplacement par défaut des modules globaux avec npm config set prefix '/usr/local', créé le dossier /usr/local/lib/node_modules(il sera utilisé par npm) et modifié les autorisations pour les dossiers utilisés par npm avec la commande:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Vous pouvez maintenant installer globalement n'importe quel module en toute sécurité. J'espère que cela t'aides!

yago
la source
1

Voici comment j'ai résolu le problème sur Windows 8.1:

  • Accédez à votre installation nodejs (généralement C: \ Program Files \ nodejs)
  • Cliquez avec le bouton droit sur le dossier node_modules et accédez aux propriétés
  • Cliquez sur l'onglet Sécurité et avancé
  • En haut, vous verrez "Owner: SYSTEM", cliquez sur changer
  • Entrez l'utilisateur pour lequel vous souhaitez des autorisations et cliquez sur OK
  • Cochez la case en bas des paramètres avancés "Remplacer toutes les entrées d'autorisation d'objet enfant par des entrées d'autorisation héritables de cet objet" et cliquez sur ok
  • Faites l'installation / mise à jour npm dont vous avez besoin
KCaradonna
la source
1

La meilleure solution serait celle fournie par la documentation npm.


Pour Ubuntu, la solution suggérée est l' option # 2

Étapes brèves:
créez un répertoire pour les installations globales:
mkdir ~/.npm-global

Configurer npm pour utiliser le nouveau chemin de répertoire: peut vous aider à vérifier si le préfixe a été mis à jour ou non. Le résultat serait <Votre répertoire personnel> /. Npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Ouvrez ou créez un fichier ~ / .profile et ajoutez cette ligne:
export PATH=~/.npm-global/bin:$PATH

De retour sur la ligne de commande, mettez à jour vos variables système:
source ~/.profile

Au lieu des étapes 2 à 4, vous pouvez également utiliser la variable ENV correspondante (par exemple, si vous ne souhaitez pas modifier ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global


Pour la solution suggérée pour Mac est l' option # 3

Sur Mac OS, vous pouvez éviter complètement ce problème en utilisant le gestionnaire de packages Homebrew

brew install node

Himanshu
la source
Ce NPM_CONFIG_PREFIX ne fonctionnera pas. Il s'agit d'une erreur dans la description npm. Voir mon article ci-dessus, comment le faire de la bonne manière: stackoverflow.com/a/41395398/1256697
suther
1

Je le résous en changeant le propriétaire de root en mon nom d'utilisateur

sudo chown -R me:me /home/me/.config/configstore/

changez-moi avec votre nom d'utilisateur et votre groupe.

Salem
la source
1

J'aime utiliser des groupes ubuntu pour y parvenir au lieu de changer de propriétaire. C'est assez simple.

  1. Installez d'abord nodejs et npm en utilisant apt-get

    sudo apt-get update && sudo apt-get install nodejs npm

  2. Déterminez qui est connecté, c'est-à-dire le nom d'utilisateur, exécutez la commande suivante pour le voir dans le terminal

    whoami

  3. Vous pouvez voir la liste des groupes qui vous sont attribués en utilisant une commande très simple, normalement le premier groupe est votre nom d'utilisateur lui-même

    groups

  4. Exécutez la commande suivante pour autoriser l'accès à l'utilisateur connecté

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. Mettre à jour npm et nodejs

    npm install -g npm

Vous êtes allset, votre utilisateur peut exécuter des commandes npm sans sudo

Vous pouvez également vous référer à ce lien https://askubuntu.com/a/1115373/687804

Gitesh Dalal
la source
0

Sur Mac OS X, lors de l'installation avec Homebrew brew install npm , le chemin d'installation est /usr/local/share/npm/avec les deux bin/et les lib/node_modules/sous - dossiers.

L'exécution de cette commande pour changer de propriétaire à votre utilisateur actuellement connecté devrait tout réparer et vous permettre d'installer des packages NPM globaux sans sudo.

sudo chown -R $USER ~/.npm /usr/local/share/npm/

Joel Purra
la source
1
Aujourd'hui, je recommanderais mon autre réponse à cette question qui utilise à la npm configplace.
Joel Purra
0

En fait, j'avais aussi le même problème. J'utilisais Ubuntu. Un problème de mine survient parce que j'avais perdu ma clé publique d'Ubuntu. Même la mise à jour de mon système ne se faisait pas. Cela donnait une erreur GPG. Dans ce cas, vous pouvez récupérer votre clé en utilisant cette commande:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

Après cela, npm fonctionne bien!

sam100rav
la source
0

John Papa souligne l'historique et le raisonnement derrière ce problème et donne une solution solide :

Les étapes de John Papa sont les suivantes:

  1. Utilisez brew pour installer le noeud sans npm
  2. Mettez à jour votre .bash_profile / .bashrc pour indiquer à npm et au nœud où installer et rechercher les packages
  3. Utilisez brew pour mettre à jour le nœud et npm pour se mettre à jour

J'espère que cela aide les curieux!

Le bateau
la source
0

C'est la solution que j'ai utilisée et travaillée. J'ai essayé d'utiliser whoamijamais travaillé.

sudo chown -R $USER /usr/local/lib/node_modules

puis

sudo chown -R $USER /usr/local/bin/npm

puis

sudo chown -R $USER /usr/local/bin/node

Casey Robinson
la source
0

La réponse de @Yves M. était très similaire à ma solution. Voici les commandes que j'ai utilisées, qui étaient légèrement différentes des siennes.

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

Recherchez ensuite la dernière version:

nvm ls-remote

Installez ensuite la dernière version:

nvm install YOUR_VERSION_HERE

exemple

nvm install v5.8.0
Ryan Loggerythm
la source