Impossible d'installer des packages à l'aide du gestionnaire de packages de nœuds dans Ubuntu

501

Le nom de l'interpréteur NodeJS ( node) sur Ubuntu a été renommé en nodejsraison d'un conflit de nom avec un autre package. Voici ce que le readme. Debian dit:

Le nom en amont de la commande d'interpréteur Node.js est "node". Dans Debian, la commande interprète a été changée en "nodejs".

Cela a été fait pour éviter une collision d'espace de noms: d'autres commandes utilisent le même nom dans leur amont, comme ax25-node du package "node".

Les scripts appelant Node.js en tant que commande shell doivent être modifiés pour utiliser à la place la commande "nodejs".

Cependant, l'utilisation de nodejs détruit l'installation de packages à l'aide de npm. L'installation du package échoue avec l'erreur suivante:

sh: 1: node: not found
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian

Comment faire comprendre à npm que nodejs est déjà installé sur le système mais que le nom de l'interpréteur est différent?

Sayem
la source
29
Vous pouvez essayer de ln -s nodejs nodedans /usr/bin. C'est une sorte de hack cependant.
vbo
1
@vbo vous pouvez ajouter cela comme réponse - cela résout le problème!
Himel Nag Rana
2
@HimelNagRana ​​J'ai une autre réponse (meilleure, acceptée). Mon commentaire initial a également été transformé pour répondre ( stackoverflow.com/a/21168305/539686 ).
vbo
4
Utilisez NVM pour installer et gérer les versions de Node.js, github.com/creationix/nvm , c'est simple et pratique!
Unitech
2
Je recommande fortement cette solution: stackoverflow.com/a/38325376/3197383 pour obtenir le contrôle des versions de nœud et npm à tout moment et pour toute utilisation.
Rémi Becheras

Réponses:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Permettez-moi tout d'abord de clarifier un peu la situation. Au cours de l'été 2012, les responsables Debian ont décidé de renommer l'exécutable Node.js pour éviter une sorte de collision d'espace de noms avec un autre paquet. Ce fut une décision très difficile pour le comité technique Debian, car elle rompt la compatibilité descendante.

Ce qui suit est une citation du projet de résolution du Comité, publié dans la liste de diffusion Debian :

  1. Le package nodejs doit être modifié pour fournir / usr / bin / nodejs, et non / usr / bin / node. Le paquet doit déclarer une relation Breaks: avec tous les paquets dans Debian qui font référence à / usr / bin / node.

  2. Le paquet source nodejs doit également fournir un paquet binaire nodejs-legacy à Priority: extra qui contient / usr / bin / node comme lien symbolique vers / usr / bin / nodejs. Aucun package dans l'archive ne peut dépendre ou recommander le package nodejs-legacy, qui est fourni uniquement pour la
    compatibilité en amont . Ce package déclare doit également déclarer une relation Conflicts: avec le package de noeud.

<...>

Le paragraphe 2 est la solution réelle au problème du PO. OP devrait essayer d'installer ce paquet au lieu de faire un lien symbolique à la main. Voici un lien vers ce paquet dans le site Web d' index des paquets Debian .

Il peut être installé à l'aide de sudo apt-get install nodejs-legacy.

Je n'ai trouvé aucune information sur l'adoption du tout par les développeurs de NPM, mais je pense que le npmpackage sera corrigé à un moment donné et nodejs-legacydeviendra vraiment un héritage.

vbo
la source
106
Pour résumer:sudo apt-get install nodejs-legacy
Alf Eaton
58
J'aime les réponses qui expliquent la situation à fond plutôt que de simplement donner l'ordre d'exécuter à l'aveugle. Ensuite, je peux copier ces informations dans les commentaires de mon script de configuration d'environnement afin que je sache ce qui se passe dans un an à partir de maintenant quand cela ne fonctionne pas.
Mnebuerquo
29
En tant que personne, je trouve incroyablement gênant que le nœud ne soit pas nœud, mais plutôt nœudjs, uniquement sur Debian. C'est vraiment, vraiment, vraiment incroyablement stupide d'éclater des outils de développement comme celui-ci. Fondamentalement, cette décision a créé une situation exceptionnelle pour Debian dans CHAQUE PAQUET NODEJS! Je n'ai jamais entendu parler de ce que "node" fait autrement, donc je manque de sympathie; (
Lodewijk
4
À moins que je manque quelque chose, ce n'était pas une collision d' espace de nom . Il n'y a pas d' espace de noms , c'était une simple collision de noms . Les espaces de noms vous permettent d'avoir le même nom deux fois (ou plus) tant que chacun existe dans un espace de noms différent . Aucun "espace" de ce type n'existe pour les noms exécutables sous Linux ou Unix. La chose la plus proche est que vous pouvez avoir plusieurs répertoires dans votre variable $ PATH, et le premier avec un exécutable nommé correspondant est utilisé. (Mais c'est vraiment très différent d'un espace de noms.)
iconoclaste
7
C'est très ennuyeux, d'autant plus que le conflit de nom était avec une "Radio Packet Amateur" .
Suzana
113

Essayez de lier un nœud à nodejs. Découvrez d'abord où est nodejs

whereis nodejs

Ensuite, le nœud de liaison souple vers nodejs

ln -s [the path of nodejs] /usr/bin/node 

Je suppose que / usr / bin est dans votre chemin d'exécution. Ensuite, vous pouvez tester en tapant node ou npm dans votre ligne de commande, et tout devrait fonctionner maintenant.

leorex
la source
3
-s crée un lien symbolique (qui est souvent le choix préféré), pas un lien dur.
hyde
20
Cela fonctionne, mais la réponse de vbo concernant l' installation du nodejs-legacypackage est plus facile.
Don Kirkby
2
J'appuie le commentaire de Don Kirkby et la réponse de vbo. Je pense que la réponse de vbo devrait être la réponse choisie.
modulitos
3
Je trouve qu'il est beaucoup plus pratique de simplement créer un lien symbolik plutôt que d'installer deux fois le même logiciel ....
frankies
7
Non . Ne pas muck avec /usr/binmoins que vous soyez dpkg. La bonne solution (si vous aimez cette approche de liaison symbolique manuelle) est de créer le lien symbolique dans/usr/local/bin lequel est désigné pour les installations et les remplacements locaux. Tout ce que vous faites manuellement /usr/binpeut être et sera écrasé par le gestionnaire de paquets et / ou le confondra.
tripleee
44

Vous pouvez également installer Nodejs à l'aide de NVM ou de Nodejs Version Manager. L' utilisation d'un gestionnaire de versions présente de nombreux avantages . L'un d'eux étant que vous n'avez pas à vous soucier de ce problème.


Instructions:


sudo apt-get update
sudo apt-get install build-essential libssl-dev

Une fois les packages requis installés, vous pouvez dérouler le script d'installation nvm depuis la page GitHub du projet. Le numéro de version peut être différent, mais en général, vous pouvez le télécharger et l'installer avec la syntaxe suivante:

curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh

Cela va télécharger le script et l'exécuter. Il installera le logiciel dans un sous-répertoire de votre répertoire personnel à l'adresse ~/.nvm. Il ajoutera également les lignes nécessaires à votre ~/.profilefichier pour utiliser le fichier.

Pour accéder à la fonctionnalité nvm, vous devrez vous déconnecter et vous reconnecter, ou vous pouvez source le fichier ~ / .profile afin que votre session actuelle soit au courant des changements:

source ~/.profile

Maintenant que nvm est installé, vous pouvez installer des versions isolées de Node.js.

Pour connaître les versions de Node.js disponibles pour l'installation, vous pouvez taper:

nvm ls-remote
. . .

v0.11.10
v0.11.11
v0.11.12
v0.11.13
v0.11.14

Comme vous pouvez le voir, la version la plus récente au moment d'écrire ces lignes est la v0.11.14. Vous pouvez l'installer en tapant:

nvm install 0.11.14

En général, nvm passera pour utiliser la dernière version installée. Vous pouvez explicitement dire à nvm d'utiliser la version que nous venons de télécharger en tapant:

nvm use 0.11.14

Lorsque vous installez Node.js à l'aide de nvm, l'exécutable est appelé node. Vous pouvez voir la version actuellement utilisée par le shell en tapant:

node -v

Le tutoriel complet peut être trouvé ici

Eduardo Dennis
la source
3
Cela a également corrigé l'erreur ci-dessus pour moi. C'est beaucoup mieux pour le développeur nodejs (à mon avis, l'ensemble des développeurs, je ne suis pas celui qui travaille dans nodejs). Je l'ai utilisé.
Ajeeb.KP
1
J'avais besoin de lier le nœud nvm à usr/bin/node. Alors courusudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
Cela fait des heures que j'essaie de comprendre cela. C'est la seule solution que j'ai trouvée pour fonctionner. Je vous remercie.
w3bMak3r
'avantages' est maintenant un lien mort
balade
20
  1. Installez d' nvmabord en utilisant:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Exécuter la commande

    source ~/.profile
  3. Maintenant, exécutez ceci et cela montrera toutes les versions installées ou d'autres packages:

    nvm ls-remote
  4. Les packages installés seront en vert. Installez la version que vous souhaitez:

    nvm install 6.0.0
  5. Vérifiez où n'est pas installé:

    which node
  6. Vérifier la version actuelle:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Ritesh
la source
2
Je recommande fortement cette solution pour obtenir le contrôle des versions de nœud et de npm à tout moment et pour toute utilisation.
Rémi Becheras
14
sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

sudo apt-get install nodejs-legacy
source ~/.profile

Combiné la réponse acceptée avec source ~/.profilele commentaire qui a été plié et certaines commandes de nettoyage avant. Très probablement, vous devrez également le faire sudo apt-get install npmaprès.

Xiao Peng - ZenUML.com
la source
12

pour moi le problème a été résolu par,

sudo apt-get remove node
sudo apt-get remove nodejs
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo ln -s /usr/bin/nodejs /usr/bin/node
alias node=nodejs
rm -r /usr/local/lib/python2.7/dist-packages/localstack/node_modules
npm install -g npm@latest || sudo npm install -g npm@latest
Shishinde
la source
10

Voici une autre approche que j'utilise car j'aime n pour basculer facilement entre les versions de nœuds.

Sur un nouveau système Ubuntu, installez d'abord le nœud 'système':

curl -sL https://deb.nodesource.com/setup | sudo bash -

Installez ensuite n module globalement:

npm install -g n

Puisque le nœud système a été installé en premier (ci-dessus), le système alternatif peut être utilisé pour pointer proprement vers le nœud fourni par n . Assurez-vous d'abord que le système alternatif n'a rien pour le nœud:

update-alternatives --remove-all node

Ajoutez ensuite le nœud fourni par n :

update-alternatives --install /usr/bin/node node /usr/local/bin/node 1

Ajoutez ensuite le nœud fourni par le système (celui qui a été installé avec curl):

update-alternatives --install /usr/bin/node node /usr/bin/nodejs 2

Sélectionnez maintenant le nœud fourni par n à l'aide du menu interactif (sélectionnez /usr/local/bin/nodedans le menu présenté par la commande suivante):

update-alternatives --config node

Enfin, étant donné /usr/local/binque la priorité est généralement plus élevée dans PATH que /usr/bin, l'alias suivant doit être créé (entrez votre .bashrc ou .zshrc) pour que le nœud système alternatif soit efficace; sinon le nœud installé avec n dans / usr / local / bin a toujours la priorité:

alias node='/usr/bin/node'

Maintenant, vous pouvez facilement basculer entre les versions de nœuds avec n <desired node version number>.

Ville
la source
9

Sur Linux Mint 17, j'ai essayé les deux solutions (créer un lien symbolique ou utiliser le nodejs-legacypackage) sans succès.

La seule chose qui a finalement fonctionné pour moi était d'utiliser le ppa de Chris Lea:

sudo apt-get purge node-*
sudo apt-get autoremove 
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

Ce nœud installé version 10.37 et npm 1.4.28. Après cela, j'ai pu installer des packages à l'échelle mondiale.

Suzana
la source
9

Comme d'autres le mentionnent déjà, je proposerai de ne pas utiliser "sudo apt-get" pour installer le nœud ou toute bibliothèque de développement. Vous pouvez télécharger la version requise depuis https://nodejs.org/dist/v6.9.2/ et configurer votre propre environnement.

Je recommanderai des outils comme nvm et n , pour gérer votre version de nœud. Il est très pratique de commuter et de travailler avec ces modules. https://github.com/creationix/nvm https://github.com/tj/n

Ou écrivez bash basique pour télécharger zip / tar, extraire le dossier de déplacement et créer un lien logiciel. Chaque fois que vous devez mettre à jour, pointez simplement l'ancien lien logiciel vers la nouvelle version téléchargée. Comme je l'ai créé pour moi-même, vous pouvez vous référer: https://github.com/deepakshrma/NodeJs-4.0-Reference-Guide/blob/master/nodejs-installer.sh

#Go to home
cd ~
#run command
#New Script
wget https://raw.githubusercontent.com/deepakshrma/NodeJs-4.0-Reference-Guide/master/nodejs-installer.sh 
bash nodejs-installer.sh -v lts
#here -v or --version can be sepecific to 0.10.37 or it could be latest/lts 
#Examples
bash nodejs-installer.sh -v lts
bash nodejs-installer.sh -v latest
bash nodejs-installer.sh -v 4.4.2
xdeepakv
la source
6

Solution simple d' ici

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash --
sudo apt-get install nodejs

Vous pouvez spécifier la version en changeant la valeur de setup_x.x, par exemple en setup_5.x

Krzysztof Karolak
la source
5

Votre système n'est pas en mesure de détecter le binaire du nœud de chemin js.

1. quel nœud

2.Ensuite, le nœud de liaison douce vers nodejs

ln -s [the path of nodejs] /usr/bin/node 

Je suppose que / usr / bin est dans votre chemin d'exécution. Ensuite, vous pouvez tester en tapant node ou npm dans votre ligne de commande, et tout devrait fonctionner maintenant.

gelées
la source
4

Désinstallez la version de nœud que vous possédez

sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

installer nvm (Node Version Manager) https://github.com/creationix/nvm

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

Vous pouvez maintenant installer la version de nœud que vous souhaitez et basculer entre les versions.

davide andreazzini
la source
Pour info - toute personne utilisant la méthode ci-dessus nvm, notez que le package nodejs-legacy est v0.10.25. (ou du moins, c'est ce que j'ai vu quand je l'ai essayé.)
JaredH
2

Je l'ai corrigé en dissociant / usr / sbin / node (qui est lié au package ax25-node), puis j'ai créé un lien vers nodejs en utilisant ceci sur la ligne de commande

sudo ln -s /usr/bin/nodejs /usr/bin/node

Parce qu'un package tel que karma ne fonctionne pas avec le nom nodejs, mais en changeant la première ligne du script karma de node en nodejs, mais je préfère résoudre ce problème une fois pour toutes

Juan Antonio Aguilar
la source
1

Pour moi, le correctif supprimait les packages node * et également les packages npm.

Puis une nouvelle installation comme:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Jimmy
la source
sudo apt-get autocleanfait "la même chose" quesudo apt-get install autoclean
m3nda
1

Le problème n'est pas dans le programme d'installation,
remplacez nodejs par node ou changez le chemin de / usr / bin / nodejs à / usr / bin / node

Vinayk93
la source
0

vous pouvez créer un ln -s nodejsnœud de lien en /usr/bin espérant que cela résoudra votre problème.

Agarwal Nitish
la source