Impossible d'utiliser NVM à partir de la racine (ou sudo)

105

J'ai mentionné que mon application utilise une version différente de NodeJS lors de l'exécution à partir de sudo.

$ node -v
v0.10.23
$ sudo node -v
v0.11.8-pre

Cette v0.11.8-pre m'a causé quelques problèmes, donc je ne veux certainement pas l'utiliser, mais je ne peux pas la changer pour root.

$ sudo nvm use v0.10.23
sudo: nvm: command not found

J'ai essayé d'installer nvm à partir de l'utilisateur root, mais j'ai obtenu l'erreur "NVM déjà installé", mais nvm toujours pas trouvé lors de l'exécution de sudo. Quel est mon problème?

Vitalii Korsakov
la source
3
Essayez sudo -s puis installez nvm.
Games Brainiac
@GamesBrainiac Désolé, mais j'ai écrit que j'ai essayé de l'installer à partir de la racine
Vitalii Korsakov
essayez de supprimer /root/.nvm/ et de réinstaller nvm à partir de zéro
Antonio E.
il n'y a pas de /root/.nvm. J'ai installé nvm à partir de sudo et il a été installé dans l'utilisateur normal homedir
Vitalii Korsakov
4
Cela résout tout mon problème comme vous aviez github.com/xtuple/nvm
Yoo Matsuo

Réponses:

220

La liste de commandes ci-dessous (source: digitalocean ) semble résoudre le problème

n=$(which node); \
n=${n%/bin/node}; \
chmod -R 755 $n/bin/*; \
sudo cp -r $n/{bin,lib,share} /usr/local

La commande ci-dessus est un peu compliquée, mais tout ce qu'elle fait est de copier la version du nœud que vous avez active via nvm dans le /usr/local/répertoire (où les fichiers globaux installés par l'utilisateur doivent vivre sur un VPS Linux) et de définir les autorisations afin que tous les utilisateurs puissent y accéder .

J'espère que cela t'aides!

Venkat Selvan
la source
7
Merci, cela m'a aidé.
Vishal Kumar Verma
7
Je vous remercie! Cela m'a fait gagner beaucoup de temps
Quinton Pike
4
Parfait! Merci beaucoup.
Jean-Baptiste Louazel
2
Impressionnant! Hier soir, j'ai ruiné tout mon système RasPi 3 en changeant désespérément les autorisations pour npm partout, aujourd'hui j'ai passé 3h à chercher la meilleure solution pour installer node / npm dans le monde sans avoir besoin de sudo pour chaque appel npm. Votre solution s'est bien déroulée avec ce message losant.com/blog/how-to-install-nodejs-on-raspberry-pi
bosch
3
Cela semble être une excellente option, mais je continue à recevoir ces erreurs:chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-debug’ chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-inspector’
trex005
130

Ma solution est de créer des liens symboliques à partir des versions de nodeet que npmj'utilise pour /usr/local/bin:

sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"

Cela rend npmet nodedisponible à tous les utilisateurs.

SimpleJ
la source
1
Excellente solution. il suffit d'ajouter "à la fin de la deuxième ligne ... (je n'ai pas pu modifier ceci moi-même pour une raison quelconque)
Rayee Roded
1
Génial, c'est de loin la meilleure solution. De cette façon, root utilisera toujours la même version de npm / node que vous utilisez sur l'utilisateur nvm, merci!
luiscvalmeida
3
Excellente solution, mais si vous changez la version du nœud que vous utilisez, vous devrez réexécuter les commandes ci-dessus.
door_number_three
4
J'utilise npxassez souvent. Alors je l'ai ajouté aussi:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
thomas
@SimpleJ comment feriez-vous la même chose pourbabel-node
user566245
14

Votre problème est que ce nvmn'est pas dans le chemin lorsque vous utilisez sudo.

Alors tapez

$ which nvm

et le résultat sera quelque chose comme

/home/abc/mynvm/nvm

Réessayez maintenant avec sudo:

sudo /home/abc/mynvm/nvm use v0.10.23

Je suppose que vous rencontrez alors le problème que l'utilisateur root ne peut pas trouver la version 0.10.13, mais voyons le message d'erreur suivant ...

CFrei
la source
42
which nvmne produit rien
Vitalii Korsakov
6
il ne produit rien pour la racine aussi
Vitalii Korsakov
3
Le problème est que je ne me connecte jamais en tant que root. Pourquoi devrais-je? Si j'ai besoin d'un accès root, j'utilise toujours sudo. Oui, je peux me connecter en tant que root et installer nvm, mais à l'avenir je ne pourrais pas courir sudo nvm use v0.10.25. Je ne pouvais donc pas non plus utiliser sudo nodede l'utilisateur.
Vitalii Korsakov
2
which nvmne fonctionne jamais, n'est-ce pas? nvmn'est pas un exécutable, c'est une fonction shell. github.com/creationix/nvm/issues/540
Matt
2
J'ai récemment posé une question similaire à propos d' which nvmici: stackoverflow.com/questions/49156104/... Utilisez type nvmpour révéler sa définition. Comme Matt l'a dit, c'est une fonction shell.
Martin Braun
13

La raison fondamentale est que ce nvmn'est pas un vrai programme. Il est une fonction bash qui est chargé dans de l'utilisateur .profile, .bashrcou ... Donc , sudone pas choisir automatiquement à partir du $ PATH comme la plupart des autres programmes.

Un autre gestionnaire de version de nœud est n: https://github.com/tj/n . Ce programme est un réel, donc sudova le ramasser par le chemin de $ sans hacks (aussi longtemps que sudopossède /usr/local/bindans son PATH $).

sudo npm install -g n  # install 'n' globally
which n                # should be /usr/local/bin/n

sudo n lts             # need sudo to switch node versions
node --version         # v6.10.0
sudo node --version    # v6.10.0
wisbucky
la source
Parfait. Merci "nvm n'est pas un problème, mais une fonction bash" :)
un autre
Haha, je viens de me rendre compte de mon "problème" mal orthographié au lieu de "programme";).
un autre
7

Selon README

Lorsque vous utilisez nvm, vous n'avez pas besoin sudod'installer globalement un module avec npm -g, donc au lieu de le faire sudo npm install -g grunt, faites à la placenpm install -g grunt

Besoin de sudo npm?

Dans mon cas, j'ai besoin de sudo npm run startqui a besoin d'accéder à un fichier nécessitant un accès root. D'après ce numéro ,

Vous n'utilisez pas sudo. Vous devriez à la place chmod / chown le fichier afin que l'utilisateur qui possède nvm ait accès au fichier ;.

En somme

Le mainteneur de nvm croit fermement que nous n'avons pas besoin de sudo: P

lzl124631x
la source
6

J'ai eu ton problème aussi. Enfin, j'ai travaillé autour de cela. Voici ma solution:

  1. Désinstallez nvm et nodejs. Voici quelques liens utiles: Désinstallation de nvm . Si vous avez installé nodejs à l'aide d'apt-get, vous pouvez le désinstaller avec la commande apt-get purge nodejs.
  2. Installez un NVM global. Voir cette page: nvm global . Comme il le dit, "Standard NVM a connu des difficultés à travailler dans des environnements multi-utilisateurs ou rootés."

Après avoir redémarré votre terminal, vous pouvez exécuter la commande sudo nvm ls.

Qianyue
la source
1
Cette branche a 12 commits en avance, 1123 commits derrière creationix: master. tiré directement du repo xtuple pour nvm
MrMesees
6
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3
Pmontrasio
la source
4

J'ai essayé la même chose sur ma machine où j'ai nvmaussi et j'ai une réponse légèrement différente:

$ sudo node --version                                                                                                                                                                    
sudo: node: command not found

Je suppose que vous avez installé le nœud 0.11 en dehors de nvm. ( Via le gestionnaire de packages ou même à partir de la source )

Par conséquent, exécuter le nœud via sudo sélectionnerait ce nœud autonome à la place.

Est-ce que cela a du sens ou est-ce que je me trompe?

Aurélien Thieriot
la source
Oui, tu as raison. J'ai installé node puis nvm . Mais tout fonctionne bien pour l'utilisateur normal et ne fonctionne pas pour la racine.
Vitalii Korsakov
1
Oh d'accord. Ensuite, je pense que nvm n'est pas destiné à être exécuté en tant que root. En fait, je suis assez convaincu que courir dans le domaine utilisateur est une fonctionnalité recherchée. Cependant, cela pourrait vous aider: github.com/creationix/nvm/issues/5
Aurélien Thieriot
Ce type a apparemment créé une NVM spéciale qui fonctionne en mode sudo: github.com/xtuple/nvm . Malheureusement uniquement en mode sudo. Je ne sais pas si c'est acceptable
Aurélien Thieriot
0

Installez NVM globalement avec
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash

Ricky
la source
creationix auteurs nvm, je ferais très attention à ce nvm tiers ...
MrMesees
4
Cette branche a 12 commits en avance, 1123 commits derrière creationix: master. Ceci est un problème, veuillez supprimer le lien
MrMesees
8
Cette réponse fait saigner mes yeux. Vous ne devriez juste rien télécharger et l'exécuter dans un sudo bash, wtf
CharlyDelta
En fait, la commande wget de nos jours se termine par | bash, aucun sudo nulle part: nvm-sh / nvm: Node Version Manager
Elise van Looij
0

La solution la plus simple à cela sera probablement de frapper simplement l'exécutable nvm.sh où qu'il se trouve.

sudo /home/ubuntu/.nvm/nvm.sh install node

Cela fonctionne bien pour moi (en supposant que ce soit le chemin d'installation).

La procédure d'installation complète ressemblerait à

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/ubuntu/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

Et puis vous pouvez exécuter la commande ci-dessus pour frapper le nvm.sh nouvellement installé

démangeaisons
la source