Les modules NPM ne seront pas installés globalement sans sudo


126

Je viens de réinstaller Ubuntu 12.04 LTS, et avant toute chose, j'ai fait ces étapes :

  1. Nœud installé via le gestionnaire de packages avec le script suivant

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. J'ai essayé d'installer les générateurs de yeoman, express, n, yeoman globalement et tous ont renvoyé la même erreur

    npm ERR! Erreur: EACCES, lien symbolique '../lib/node_modules/n/bin/n'

    npm ERR! {[Erreur: EACCES, lien symbolique '../lib/node_modules/n/bin/n'] errno: 3, code: 'EACCES', chemin: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Veuillez réessayer d'exécuter cette commande en tant que root / administrateur.

    npm ERR! Système Linux 3.8.0-29-générique

    npm ERR! commande "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! nœud -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! chemin ../lib/node_modules/n/bin/n

    npm ERR! code EACCES

    npm ERR! errno 3

    npm ERR! Erreur de pile: EACCES, lien symbolique '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Des détails de journalisation supplémentaires peuvent être trouvés dans:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! pas ok code 0

  3. Récupération de la propriété des dossiers suivants de manière récursive ~ / .npm, / usr / lib / node, / usr / lib / node_modules, et des liens symboliques suivants / usr / bin / node, / usr / bin / nodejs sans aucun succès

J'ai besoin d'installer yeoman et ses générateurs sans sudo pour ne pas avoir de problèmes plus tard :(


Merci Phil, maintenant ça a l'air beaucoup mieux
HeberLZ

2
Si vous voulez que npm installe des packages globaux dans $ HOME plutôt que / usr, suivez le guide github.com/sindresorhus/guides/blob/master
Colonel Panic

c'est ce qui a fonctionné pour moi github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL

Une duplication possible de npm génère une erreur sans sudo
Louis

Réponses:


318

Ubuntu 12.04 et l'utilisation du PPA de Chris Lea pour installer ce qui suit fonctionne pour moi:

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

et ajouter $ HOME / .npm-packages / bin à $ PATH

ajouter à .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

voir https://stackoverflow.com/a/18277225 de @passy


9
Cela ressemble à une solution beaucoup plus propre. Si vous n'aimez pas les dossiers système de votre répertoire personnel, vous pouvez également utiliser un emplacement tel que ~ / .local / share / npm.
JeroenHoek

Il convient de noter qu'après avoir modifié le préfixe, vous devez réinstaller tous les modules globaux que vous aviez installés précédemment, y compris npm lui-même.
Dziamid

Cela semble bien, mais j'ai trouvé beaucoup plus facile de donner à l'utilisateur la permission d'écrire /usr/lib/node_modules/. Ou peut-être même approprié de créer un groupe unix nodejs et de donner à ce groupe la permission d'écrire dans ce répertoire.
mehulkar

Un petit détail à ajouter est que vous devez créer vous-même le répertoire ~ / npm. Sinon, npm se fermera avec une erreur ENOENT.
Jason Farnsworth

6
Pourquoi n'est-ce pas la valeur par défaut pour npm? Merci d'avoir partagé.
Dorian

23

Si vous avez déjà $HOME/binsur votre chemin, une solution plus simple est juste ...

npm config set prefix ~
  • Les nouvelles commandes de nœud vont maintenant s'installer dans votre $HOME/binrépertoire.
  • Pas besoin de changer de chemin!

Étant donné que cette discussion porte vraiment sur la réduction des risques de sécurité liés à l'exécution sudo, vous devez également savoir que toute application de nœud peut potentiellement installer un nom d'application qui ne correspond pas au nom du package de nœud enregistré que vous pensez installer. Il y a donc un risque de sécurité qu'un npm installremplacera une commande système existante ou une commande déjà présente $HOME/bin. Si vous êtes concerné, vérifiez d'abord les propriétés binet scriptsdans le package.jsonfichier de l'application que vous installez.

En général, il est plus sûr de:

  • (a) Placez le $HOME/bindernier dans votre chemin pour que les commandes système ne soient pas remplacées.
  • (b) n'incluez pas "." ou tout chemin relatif dans votre $PATHafin de ne pas exécuter accidentellement une commande se trouvant dans le répertoire actuel.

Référence:


1
Un autre problème de sécurité important avec npmest que le code source que vous voyez sur un github.comdépôt pour un package de nœuds peut ne pas être le même que celui que vous installez à partir du npm.orgserveur de registre!
Tony O'Hagan

Alors qu'en théorie, un package de nœuds bien conçu pourra être installé avec plaisir ~/bin, certains packages de nœuds (ou leurs packages dépendants) n'ont été testés que pour l'installation, sudoalors sachez que vous pouvez rencontrer un problème "d'environnement d'installation" non testé. Comme pour tout autre problème d'environnement (comme le changement d'OS), le principe «d'écrire une fois, de tester partout» est toujours valable.
Tony O'Hagan

L'inconvénient de cette méthode est que npm crée un répertoire supplémentaire, appelé ~ / lib. Selon les pratiques de votre organisation, cela peut ne pas être souhaitable.
M. S

13

Quant à octobre 2014:

Node.js est disponible à partir de la distribution des binaires NodeSource Debian et Ubuntu référentiel .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

C'est tout.

Réponse obsolète:

Le moyen le plus rapide sans utiliser sudo est comme décrit ici par isaac

Je vous encourage fortement à ne pas faire de gestion de paquets avec sudo! Les packages peuvent exécuter des scripts arbitraires, ce qui rend sudoing une commande de gestionnaire de packages aussi sûre qu'une coupe de cheveux à la tronçonneuse. Bien sûr, c'est rapide et va certainement surmonter tous les obstacles, mais vous voudrez peut-être que cet obstacle reste là.

Je recommande de le faire une fois à la place:

sudo chown -R $USER /usr/local

ÉDITER:

Il existe certains problèmes de sécurité et limitations de fonctionnalités concernant la modification de la propriété de / usr / local à l'utilisateur actuel:

Cela dit, si vous souhaitez installer le module global sans utiliser sudo, je ne vois pas de meilleure solution (d'un point de vue pragmatique) que celle mentionnée. La sécurité contre la facilité d'utilisation est un sujet très vaste, et il n'y a pas de réponse facile à cela - cela dépend simplement de vos besoins.


23
C'est une mauvaise idée car cela fait que tout / usr / local appartient à un seul utilisateur.
Reed G. Law

4
Comme l'a souligné @ ReedG.Law, c'est vraiment une mauvaise idée. Ne changez pas la propriété de / usr / local en un utilisateur spécifique.
Christopher Will

3
Je suis d'accord avec Reed G Law - changer / usr / local est une MAUVAISE mauvaise idée. Dans mon cas, je regardais les directions et je l'ai fait: je me suis ensuite rappelé que je devais PARTAGER cela avec une autre personne faisant du développement. J'y suis retourné et (j'espère) j'ai obtenu tous les changements. Ce n'est pas seulement la sécurité, mais aussi la fonctionnalité.
Lloyd Sargent

3
Y a-t-il un inconvénient à cette solution s'il n'y a qu'un seul utilisateur sur le système?
connorbode

2
Désolé, voulait dire /usr/local/lib/node_modulesetnode
Creynders

11

Le problème était que j'avais installé le nœud à l'aide de sudo , pour éviter les erreurs lors de l'installation des modules npm globalement, il ne fallait JAMAIS installer de nœud avec sudo.

Ma solution était de réinstaller le nœud de cette façon:

Téléchargez les dernières sources de nœuds stables sur 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 -R $ USER / usr / local

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

Une chose à noter est que seul le fait de prendre possession du dossier / usr / local ne fonctionnerait pas dans mon cas car l'installation du nœud lui-même a été faite avec sudo

Dernière étape pour installer yeoman: # bien que sur yeoman.io il est dit que faire "npm install -g yo" installe déjà bower et grunt, il y a quelques sous-modules de grunt qui échouent, donc j'ai corrigé cela en l'installant par lui-même

npm install -g bower

npm installer -g grunt

npm install -g yo

npm install -g générateur-angulaire


Excellent en théorie, mais y a-t-il un moyen d'obtenir le même effet sans être obligé de construire Node et d'installer 4 modules supplémentaires juste pour avoir accès aux modules dans le monde?
Dan Nissenbaum

La réponse sélectionnée fonctionne exactement comme vous le souhaitez. C'est ce que j'ai fait il y a 2 ans quand il n'y avait pas encore d'autre solution publique, mais maintenant c'est inutile
HeberLZ

5

J'ai résolu ce problème avec la variable d'environnement et l'alias du shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Pour moi, npm n'a pas respecté le paramètre de configuration "prefix" dans .npmrc.


2

Selon ce message SO similaire: npm génère une erreur sans sudo

Il semble que vous ayez un problème de propriété avec l' ~/.npmannuaire.

Comme pour la réponse dans celle-ci, essayez:

sudo chown -R `whoami` ~/.npm

En fait, cela n'a pas fonctionné comme je l'ai expliqué à l'étape 3 de ce que j'ai essayé lorsque je ne pouvais pas le faire fonctionner, le problème était que j'avais installé le nœud à l'aide de sudo, ce qui peut dans certaines circonstances poser des problèmes. Une fois que j'ai supprimé le nœud et l'ai réinstallé à partir de ses sources, tout a commencé à fonctionner comme prévu!
HeberLZ

@HeberLZ Je pense que vous avez raison, j'ai juste essayé de faire ça sur une autre machine hier soir et ça ne fonctionnait pas. J'avais également d'autres problèmes d'autorisation à régler. Vous ne savez toujours pas quelle est la meilleure façon de ne pas exécuter cette installation npm à partir de la source.
prasanthv

Liez à la question dans les commentaires ou marquez la question actuelle comme un doublon. Il ne sert à rien de copier-coller les réponses d'autres questions.
givanse le

@HeberLZ le vote négatif de cette réponse est inapproprié car il adresse le titre de la question que vous avez posée.
Sebastian Sastre

Je ne me souviens pas quand j'ai décliné la réponse, mais dans mon cas particulier, ce que vous avez écrit n'a pas résolu le problème, raison pour laquelle je pense que j'ai probablement décliné la réponse. Comme indiqué sur la question: "A récupéré la propriété des dossiers suivants de manière récursive ~ / .npm, / usr / lib / node, / usr / lib / node_modules, et des liens symboliques suivants / usr / bin / node, / usr / bin / nodejs sans aucun succès "J'ai essayé de m'approprier .npm, et tous ces autres dossiers sans succès
HeberLZ

2

Trouvez le chemin du répertoire de npm:

npm config get prefix

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

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).

Voici le lien pour plus de détails

https://docs.npmjs.com/getting-started/fixing-npm-permissions


Vital. Essayez d'éviter d'ajouter binet shareentre crochets. L'ignorer peut conduire à changer la propriété de ces dossiers à l'utilisateur actuel et à des problèmes d'installation de nouveaux packages sur le système, sudocar leur propriété sera également modifiée
A.Ametov

cette recommandation détruit tout mon système de fichiers: (
UA_

1

Si vous êtes sur une machine de développement, vous feriez peut-être mieux d'envisager d'utiliser nvm .

Sinon, vous souhaitez simplement installer en utilisant votre gestionnaire de paquets préféré.

Quoi qu'il en soit, je vous recommande de vérifier cette réponse sur stackoverflow


1

En fait, je viens de modifier l'autorisation d'un dossier utilisateur appartenant à root:

sudo chown -R $USER ~/.config/configstore

Ensuite, je pourrais "npm install" et "bower install" sans sudo! A bien fonctionné!


0

en utilisant lubuntu 14.04.3, j'ai essayé de changer la propriété du préfixe .npm et npm, mis à jour mon chemin, npm a installé des modules dans mon répertoire personnel sans sudo mais le chemin était incorrect donc les modules comme braise n'ont pas été trouvés, linuxbew a résolu le problème, rapidement guide de configuration ici pour node / npm


0

Ce problème et d'autres causés par la même raison peuvent être résolus en installant Node dans l'espace utilisateur.

Vous pouvez le faire simplement en copiant et en collant dans votre terminal

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Les mêmes commandes peuvent également être lancées pour mettre à jour Node vers la dernière version.

N'oubliez pas de modifier votre environnement. Une seule fois, fais

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Consultez cet article pour savoir comment installer Node.js sans sudo .

Pour une solution plus générale à ce sujet (c.-à-d. Installer le logiciel localement), voir dotsoftware .


0

utilisez simplement nvm, vous pourrez basculer dynamiquement entre les différentes versions de nœuds et il est installé localement pour votre utilisateur. Aucun sudo nécessaire. Assurez-vous simplement d'avoir complètement nettoyé l'ancien nœud au préalable.

https://github.com/nvm-sh/nvm


-2

La meilleure solution que j'ai trouvée était d'installer Node.js à partir du package tar sur le répertoire de base de l'utilisateur et de lier l'emplacement du dossier lib. Voici ce que tu dois faire

Cela installera Nodejs sous ~ / .local / au lieu de la valeur par défaut / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Si vous rencontrez toujours une erreur de propriété ou d'autorisation lors de l'installation des packages, modifiez la propriété de ~ / .local / dir en exécutant

chown -R user:user ~/.local/

Maintenant, vous devriez être prêt à installer les packages via 'npm'

Remarque: TOUTES LES COMMANDES CI-DESSUS DOIVENT ÊTRE EXÉCUTÉES EN TANT QU'UTILISATEUR. N'UTILISEZ PAS DE CONNEXION SUDO OU ROOT

NE JAMAIS MODIFIER L'AUTORISATION DES DOSSIERS SOUS '/ USR / LIB /'. Mènera à un système d'exploitation instable



-2

Je trouve les explications de Pawel Grzybek très convaincantes: elles se résument à 3 commandes sudo simples, sans jamais avoir à utiliser à nouveau sudo pour les installations npm globales:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.