No se pueden instalar paquetes usando el administrador de paquetes de nodo en Ubuntu

501

El nombre del intérprete NodeJS ( node) en Ubuntu ha sido renombrado nodejsdebido a un conflicto de nombre con otro paquete. Esto es lo que el archivo Léame. Debian dice:

El nombre ascendente del comando de intérprete Node.js es "nodo". En Debian, el comando del intérprete se ha cambiado a "nodejs".

Esto se hizo para evitar una colisión del espacio de nombres: otros comandos usan el mismo nombre en su flujo ascendente, como ax25-node del paquete "node".

Las secuencias de comandos que llaman a Node.js como un comando de shell deben cambiarse para utilizar el comando "nodejs".

Sin embargo, usar nodejs dificulta la instalación de paquetes usando npm. La instalación del paquete falla con el siguiente error:

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

¿Cómo hago para que npm entienda que nodejs ya está instalado en el sistema pero que el nombre del intérprete es diferente?

Sayem
fuente
29
Usted puede tratar de ln -s nodejs nodeen /usr/bin. Sin embargo, es una especie de truco.
vbo
1
@vbo puedes agregar eso como respuesta: ¡resuelve el problema!
Himel Nag Rana
2
@HimelNagRana ​​Tengo otra respuesta (mejor, aceptada). Mi comentario inicial también se transformó para responder ( stackoverflow.com/a/21168305/539686 ).
vbo
44
Use NVM para instalar y administrar las versiones de Node.js, github.com/creationix/nvm , ¡es fácil y conveniente!
Unitech
2
Recomiendo esta solución: stackoverflow.com/a/38325376/3197383 para obtener el control de las versiones de nodo y npm en cualquier momento y para cualquier uso.
Rémi Becheras

Respuestas:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Antes que nada déjenme aclarar un poco la situación. En el verano de 2012, los mantenedores de Debian decidieron renombrar el ejecutable Node.js para evitar algún tipo de colisión de espacio de nombres con otro paquete. Fue una decisión muy difícil para el Comité Técnico de Debian, porque rompe la compatibilidad con versiones anteriores.

La siguiente es una cita del proyecto de resolución del Comité, publicado en la lista de correo de Debian :

  1. El paquete nodejs se cambiará para proporcionar / usr / bin / nodejs, no / usr / bin / node. El paquete debe declarar una relación Breaks: con cualquier paquete en Debian que haga referencia a / usr / bin / node.

  2. El paquete fuente de nodejs también proporcionará un paquete binario de nodejs-legacy en Priority: extra que contiene / usr / bin / node como un enlace simbólico a / usr / bin / nodejs. Ningún paquete en el archivo puede depender o recomendar el paquete nodejs-legacy, que se proporciona únicamente para
    compatibilidad ascendente . Este paquete declara también declarará un conflicto: relación con el paquete de nodo.

<...>

El párrafo 2 es la solución real para el problema de OP. OP debería intentar instalar este paquete en lugar de hacer un enlace simbólico a mano. Aquí hay un enlace a este paquete en el sitio web del índice del paquete Debian .

Se puede instalar usando sudo apt-get install nodejs-legacy.

No he encontrado ninguna información sobre la adopción de todo esto por parte de los desarrolladores de NPM, pero creo que el npmpaquete se solucionará en algún momento y se nodejs-legacyconvertirá en un verdadero legado.

vbo
fuente
106
Para resumir:sudo apt-get install nodejs-legacy
Alf Eaton
58
Me gustan las respuestas que explican la situación a fondo en lugar de simplemente dar una orden para ejecutar a ciegas. Luego puedo copiar esa información en los comentarios en el script de configuración de mi entorno para saber lo que está sucediendo dentro de un año cuando no funcione.
Mnebuerquo
29
Como persona, me parece increíblemente inconveniente que ese nodo no sea nodo, sino nodojs, solo en Debian. Es muy, muy, realmente increíblemente estúpido dividir herramientas de desarrollo como esta. ¡Básicamente, esta decisión creó una situación excepcional para Debian en CADA PAQUETE NODEJS! Nunca he oído lo que el "nodo" hace de otra manera, así que me falta simpatía; (
Lodewijk
44
A menos que me falte algo, esta no fue una colisión de espacio de nombres . No hay espacio de nombres , fue una simple colisión de nombres . Los espacios de nombre le permiten tener el mismo nombre dos veces (o más) siempre que cada uno exista en un espacio de nombre diferente . No existen tales "espacios" para nombres ejecutables en Linux o Unix. Lo más parecido es que puede tener múltiples directorios en su variable $ PATH, y se utiliza el primero con un ejecutable con nombre coincidente. (Pero eso es realmente muy diferente de un espacio de nombres)
Iconoclasta
77
Esto es muy molesto, aún más porque el conflicto de nombres fue con una "Radio de paquetes de aficionados" .
Suzana
113

Intente vincular nodo a nodojs. Primero descubra dónde está nodejs

whereis nodejs

Luego enlace de nodo a nodojs

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

Supongo que / usr / bin está en su ruta de ejecución. Luego puede probar escribiendo node o npm en su línea de comando, y todo debería funcionar ahora.

leorex
fuente
3
-s crea un enlace simbólico (que a menudo es la opción preferida), no un enlace duro.
hyde
20
Esto funciona, pero la respuesta de vbo de instalar el nodejs-legacypaquete es más fácil.
Don Kirkby
2
Secundo el comentario de Don Kirkby y la respuesta de vbo. Creo que la respuesta de vbo debería ser la respuesta seleccionada.
modulitos
3
Me resulta mucho más conveniente que haga un enlace Symbolik en lugar de instalar el mismo software en dos ocasiones ....
frankies
77
No. No te metas a /usr/binmenos que lo seas dpkg. La solución adecuada (si le gusta este enfoque de enlace simbólico/usr/local/bin manual) es crear el enlace simbólico en el que está designado para las instalaciones y anulaciones locales. Cualquier cosa que haga manualmente /usr/binpuede ser sobrescrita por el administrador de paquetes y / o lo confundirá.
tripleee
44

También puede instalar Nodejs usando NVM o Nodejs Version Manager Hay muchos beneficios al usar un administrador de versiones. Uno de ellos es que no tiene que preocuparse por este problema.


Instrucciones:


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

Una vez que se instalan los paquetes de requisitos previos, puede desplegar el script de instalación de nvm desde la página GitHub del proyecto. El número de versión puede ser diferente, pero en general, puede descargarlo e instalarlo con la siguiente sintaxis:

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

Esto descargará el script y lo ejecutará. Instalará el software en un subdirectorio de su directorio de inicio en~/.nvm . También agregará las líneas necesarias a su ~/.profilearchivo para usar el archivo.

Para obtener acceso a la funcionalidad nvm, deberá cerrar sesión y volver a iniciarla, o puede obtener el archivo ~ / .profile para que su sesión actual conozca los cambios:

source ~/.profile

Ahora que tiene instalado nvm, puede instalar versiones aisladas de Node.js.

Para conocer las versiones de Node.js que están disponibles para la instalación, puede escribir:

nvm ls-remote
. . .

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

Como puede ver, la versión más nueva en el momento de escribir este artículo es v0.11.14. Puede instalar eso escribiendo:

nvm install 0.11.14

Por lo general, nvm cambiará para usar la versión instalada más recientemente. Puede decirle explícitamente a nvm que use la versión que acabamos de descargar escribiendo:

nvm use 0.11.14

Cuando instala Node.js usando nvm, el ejecutable se llama nodo. Puede ver la versión que está utilizando actualmente el shell escribiendo:

node -v

El tutorial completo se puede encontrar aquí.

Eduardo Dennis
fuente
3
Esto también solucionó el error anterior para mí. Es mucho mejor para el desarrollador de nodejs (en mi opinión, los desarrolladores completos, no soy uno que trabaje en nodejs). Lo usé
Ajeeb.KP
1
Necesitaba un enlace suave al nodo nvm usr/bin/node. Así corriósudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
He estado trabajando tratando de resolver esto durante horas. Esta es la única solución que encontré para trabajar. Gracias.
w3bMak3r
'beneficios' ahora es un enlace muerto
jaunt
20
  1. Instalar nvmprimero usando:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Ejecutar comando

    source ~/.profile
  3. Ahora ejecute esto y esto mostrará todas las versiones instaladas u otros paquetes:

    nvm ls-remote
  4. Los paquetes instalados estarán en verde. Instala la versión que quieras:

    nvm install 6.0.0
  5. Verifique dónde no está instalado:

    which node
  6. Verifique la versión actual:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Ritesh
fuente
2
Recomiendo esta solución para obtener el control de las versiones de nodo y npm en cualquier momento y para cualquier uso.
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 respuesta aceptada con source ~/.profileel comentario que se ha doblado y algunos comandos de limpieza anteriores. Lo más probable es que también necesites hacerlo sudo apt-get install npmdespués.

Xiao Peng - ZenUML.com
fuente
12

para mí el problema fue resuelto por

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
shrishinde
fuente
10

Aquí hay otro enfoque que uso ya que me gusta n para cambiar fácilmente entre versiones de nodo.

En un nuevo sistema Ubuntu, primero instale el nodo 'sistema':

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

Luego instale n módulo globalmente:

npm install -g n

Dado que el nodo del sistema se instaló primero (arriba), el sistema alternativo se puede utilizar para señalar limpiamente el nodo proporcionado por n . Primero asegúrese de que el sistema de alternativas no tenga nada para el nodo:

update-alternatives --remove-all node

Luego agregue el nodo proporcionado por n :

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

A continuación, agregue el nodo proporcionado por el sistema (el que se instaló con curl):

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

Ahora seleccione el nodo provisto por n usando el menú interactivo (seleccione /usr/local/bin/nodedel menú presentado por el siguiente comando):

update-alternatives --config node

Finalmente, dado que /usr/local/bingeneralmente tiene una mayor precedencia en PATH que /usr/bin, se debe crear el siguiente alias (ingrese en su .bashrc o .zshrc) si el nodo del sistema alternativo va a ser efectivo; de lo contrario, el nodo instalado con n en / usr / local / bin siempre tiene prioridad:

alias node='/usr/bin/node'

Ahora puede cambiar fácilmente entre versiones de nodo con n <desired node version number>.

Ville
fuente
9

En Linux Mint 17, probé ambas soluciones (crear un enlace simbólico o usar el nodejs-legacypaquete) sin éxito.

Lo único que finalmente funcionó para mí fue usar el 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

Este nodo instalado versión 10.37 y npm 1.4.28. Después de eso, podría instalar paquetes a nivel mundial.

Suzana
fuente
9

Como otras personas ya mencionan, sugeriré no usar "sudo apt-get" para instalar el nodo o cualquier biblioteca de desarrollo. Puede descargar la versión requerida de https://nodejs.org/dist/v6.9.2/ y configurar su propio entorno.

Voy a recomendar herramientas como NVM y n , para gestionar la versión nodo. Es muy conveniente cambiar y trabajar con estos módulos. https://github.com/creationix/nvm https://github.com/tj/n

O escriba bash básico para descargar zip / tar, extraiga la carpeta de movimiento y cree un enlace suave. Siempre que necesite actualizar, simplemente apunte el viejo enlace suave a la nueva versión descargada. Como he creado para mí, puede consultar: 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
fuente
6

Solución simple desde aquí

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

Puede especificar la versión cambiando el valor de setup_x.x, por ejemplo a setup_5.x

Krzysztof Karolak
fuente
5

Su sistema no puede detectar la ruta del nodo js binario.

1. cual nodo

2.Luego, enlace de nodo a nodojs

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

Supongo que / usr / bin está en su ruta de ejecución. Luego puede probar escribiendo node o npm en su línea de comando, y todo debería funcionar ahora.

heladas
fuente
4

Desinstale cualquier versión de nodo que tenga

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

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

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

Ahora puede instalar cualquier versión del nodo que desee y cambiar entre las versiones.

davide andreazzini
fuente
FYI: cualquiera que use el método anterior nvm, tenga en cuenta que el paquete nodejs-legacy es v0.10.25. (o al menos, eso es lo que vi cuando lo intenté).
JaredH
2

Lo arreglé desvinculando / usr / sbin / node (que está vinculado al paquete ax25-node), luego he creado un enlace a nodejs usando esto en la línea de comando

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

Debido a que un paquete como el karma no funciona con el nombre de nodejs, sin embargo, cambia la primera línea del script de karma de node a nodejs, pero prefiero resolver este problema de una vez por todas

Juan Antonio Aguilar
fuente
1

Para mí, la solución fue eliminar los paquetes de nodo * y también los paquetes npm.

Luego una nueva instalación como:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Palanqueta
fuente
sudo apt-get autocleanhace "lo mismo" quesudo apt-get install autoclean
m3nda
1

El problema no está en el instalador,
reemplace nodejs con node o cambie la ruta de / usr / bin / nodejs a / usr / bin / node

Vinayk93
fuente
0

puede crear un ln -s nodejsnodo de enlace con la /usr/bin esperanza de que esto resuelva su problema.

Nitish Agarwal
fuente