Não é possível instalar pacotes usando o gerenciador de pacotes de nós no Ubuntu

501

O nome do interpretador NodeJS ( node) no Ubuntu foi renomeado nodejsdevido a um conflito de nome com outro pacote. Aqui está o que o leia-me. O Debian diz:

O nome upstream do comando interpretador Node.js. é "nó". No Debian, o comando interpretador foi alterado para "nodejs".

Isso foi feito para impedir uma colisão de espaço para nome: outros comandos usam o mesmo nome em seus upstream, como ax25-node do pacote "node".

Os scripts que chamam o Node.js como um comando do shell devem ser alterados para usar o comando "nodejs".

No entanto, o uso de nodejs facilita a instalação de pacotes usando npm. A instalação do pacote falha com o seguinte erro:

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

Como faço para o npm entender que o nodejs já está instalado no sistema, mas o nome do interpretador é diferente?

Sayem
fonte
29
Você pode tentar ln -s nodejs nodeem /usr/bin. É meio que um truque.
vbo
1
@ vbo, você pode adicionar isso como resposta - resolve o problema!
Himel Nag Rana
2
@HimelNagRana ​​Tenho outra resposta (melhor, aceita). Meu comentário inicial também foi transformado para responder ( stackoverflow.com/a/21168305/539686 ).
vbo
4
Use o NVM para instalar e gerenciar versões do Node.js. github.com/creationix/nvm , é fácil e conveniente!
Unitech
2
Eu recomendo esta solução: stackoverflow.com/a/38325376/3197383 para obter o controle das versões de nó e npm a qualquer momento e para qualquer uso.
Rémi Becheras 21/11

Respostas:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Antes de mais, deixe-me esclarecer um pouco a situação. No verão de 2012, os mantenedores do Debian decidiram renomear o Node.js executável para evitar algum tipo de colisão de namespace com outro pacote. Foi uma decisão muito difícil para o Comitê Técnico Debian, porque quebra a compatibilidade com versões anteriores.

A seguir, uma citação do rascunho da resolução do Comitê, publicado na lista de discussão Debian :

  1. O pacote nodejs deve ser alterado para fornecer / usr / bin / nodejs, não / usr / bin / node. O pacote deve declarar um relacionamento Breaks: com quaisquer pacotes no Debian que façam referência a / usr / bin / node.

  2. O pacote de origem nodejs também deve fornecer um pacote binário nodejs-legacy em Priority: extra que contém / usr / bin / node como um link simbólico para / usr / bin / nodejs. Nenhum pacote no archive pode depender ou recomendar o pacote nodejs-legacy, que é fornecido apenas para
    compatibilidade com upstream . Este pacote declara também deve declarar um relacionamento Conflicts: com o pacote do nó.

<...>

O parágrafo 2 é a solução real para a questão do OP. O OP deve tentar instalar este pacote em vez de fazer o link simbólico manualmente. Aqui está um link para este pacote no índice de pacotes Debian site de .

Pode ser instalado usando sudo apt-get install nodejs-legacy.

Não encontrei nenhuma informação sobre a adoção de tudo pelos desenvolvedores do NPM, mas acho que o npmpacote será corrigido em algum momento e nodejs-legacyse tornará realmente legado.

vbo
fonte
106
Para resumir:sudo apt-get install nodejs-legacy
Alf Eaton
58
Eu gosto de respostas que explicam a situação completamente, em vez de apenas dar um comando para executar cegamente. Depois, posso copiar essas informações nos comentários no script de configuração do meu ambiente para saber o que está acontecendo daqui a um ano, quando não funcionar.
Mnebuerquo
29
Como pessoa, acho incrivelmente inconveniente que o nó não seja o nó, mas sim o nodejs, apenas no Debian. É realmente, realmente, incrivelmente estúpido dividir ferramentas de desenvolvimento como essa. Basicamente, essa decisão criou uma situação excepcional para o Debian em TODOS OS PACOTES NODEJS! Eu nunca ouvi falar do que o "nó" faz de outra maneira, por isso não tenho nenhuma simpatia; (
Lodewijk
4
A menos que eu esteja perdendo alguma coisa, isso não foi uma colisão de espaço de nome . Não há espaço para nome , foi uma simples colisão de nomes . Os espaços para nome permitem que você tenha o mesmo nome duas vezes (ou mais), desde que cada um exista em um espaço para nome diferente . Não existem "espaços" para nomes de executáveis ​​no Linux ou Unix. O mais próximo é que você pode ter vários diretórios em sua variável $ PATH, e o primeiro com um executável nomeado correspondente é usado. (Mas isso é realmente muito diferente de um espaço para nome.)
iconoclast
7
Isso é muito chato, ainda mais porque o conflito de nomes ocorreu com um "Amateur Packet Radio" .
Suzana
113

Tente vincular o nó ao nodejs. Primeiro descubra onde está o nodejs

whereis nodejs

Em seguida, vincule o nó ao nodejs

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

Estou assumindo que / usr / bin está no seu caminho de execução. Em seguida, você pode testar digitando node ou npm na linha de comando e tudo deve funcionar agora.

leorex
fonte
3
-s cria um link simbólico (que geralmente é a opção preferida), não um link físico.
hyde 16/01
20
Isso funciona, mas a resposta do vbo para instalar o nodejs-legacypacote é mais fácil.
Don Kirkby
2
Eu segundo o comentário de Don Kirkby e a resposta do vbo. Eu acho que a resposta do vbo deve ser a resposta selecionada.
Modulitos
3
Acho que é muito mais conveniente para apenas criar um link Symbolik em vez de instalar o mesmo software duas vezes ....
frankies
7
Não . Não estrague, a /usr/binmenos que você esteja dpkg. A solução adequada (se você gosta dessa abordagem de ligação simbólica manual) é criar o link simbólico/usr/local/bin designado para instalações e substituições locais. Tudo o que você faz manualmente /usr/binpode e será substituído pelo gerenciador de pacotes e / ou irá confundi-lo.
triplo
44

Você também pode instalar o Nodejs usando o NVM ou o Nodejs Version Manager. Há muitos benefícios em usar um gerenciador de versão. Sendo um deles, você não precisa se preocupar com esse problema.


Instruções:


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

Após a instalação dos pacotes de pré-requisito, você pode puxar o script de instalação nvm da página GitHub do projeto. O número da versão pode ser diferente, mas, em geral, você pode fazer o download e instalá-lo com a seguinte sintaxe:

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

Isso fará o download do script e o executará. Ele instalará o software em um subdiretório do diretório inicial em ~/.nvm. Ele também adicionará as linhas necessárias ao seu~/.profile arquivo para usá-lo.

Para obter acesso à funcionalidade nvm, será necessário fazer logoff e logon novamente, ou você pode originar o arquivo ~ / .profile para que sua sessão atual conheça as alterações:

source ~/.profile

Agora que você tem o nvm instalado, é possível instalar versões isoladas do Node.js.

Para descobrir as versões do Node.js disponíveis para instalação, você pode digitar:

nvm ls-remote
. . .

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

Como você pode ver, a versão mais recente no momento desta redação é a v0.11.14. Você pode instalar isso digitando:

nvm install 0.11.14

Geralmente, o nvm muda para usar a versão instalada mais recentemente. Você pode dizer explicitamente à nvm para usar a versão que acabamos de baixar digitando:

nvm use 0.11.14

Quando você instala o Node.js usando o nvm, o executável é chamado de nó. Você pode ver a versão atualmente sendo usada pelo shell digitando:

node -v

O tutorial completo pode ser encontrado aqui

Eduardo Dennis
fonte
3
Isso também corrigiu o erro acima para mim. É muito melhor para o desenvolvedor do nodejs (na minha opinião, todos os desenvolvedores, eu não sou aquele que trabalha no nodejs). Eu usei.
Ajeeb.KP
1
Eu precisava vincular o nó nvm usr/bin/node. Assim correusudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
Estou trabalhando tentando descobrir isso há horas. Essa é a única solução que encontrei para funcionar. Obrigado.
w3bMak3r
'benefícios' é agora um link morto
excursão
20
  1. Instale nvmprimeiro usando:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Comando de execução

    source ~/.profile
  3. Agora execute isso e isso mostrará todas as versões instaladas ou outras versões dos pacotes:

    nvm ls-remote
  4. Pacotes instalados estarão em verde. Instale a versão que você deseja:

    nvm install 6.0.0
  5. Verifique onde não está instalado:

    which node
  6. Verifique a versão atual:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Ritesh
fonte
2
Eu recomendo esta solução para obter o controle das versões do nó e do npm a qualquer momento e para qualquer uso.
Rémi Becheras 21/11
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

Combine a resposta aceita com source ~/.profileo comentário que foi dobrado e alguns comandos de limpeza antes. Muito provavelmente você também precisará sudo apt-get install npmdepois.

Xiao Peng - ZenUML.com
fonte
12

para mim o problema foi resolvido 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
fonte
10

Aqui está outra abordagem que eu uso, pois gosto de n para facilitar a alternância entre versões de nós.

Em um novo sistema Ubuntu, primeiro instale o nó 'system':

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

Em seguida, instale o módulo n globalmente:

npm install -g n

Como o nó do sistema foi instalado primeiro (acima), o sistema alternativo pode ser usado para apontar corretamente para o nó fornecido por n . Primeiro verifique se o sistema de alternativas não tem nada para o nó:

update-alternatives --remove-all node

Em seguida, adicione o nó fornecido por n :

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

Em seguida, adicione o nó fornecido pelo sistema (aquele que foi instalado com curl):

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

Agora selecione o nó fornecido por n usando o menu interativo (selecione /usr/local/bin/nodeno menu apresentado pelo seguinte comando):

update-alternatives --config node

Por fim, como /usr/local/bingeralmente tem uma precedência mais alta no PATH do que /usr/bin, o alias a seguir deve ser criado (digite seu .bashrc ou .zshrc) para que o nó do sistema alternativo seja eficaz; caso contrário, o nó instalado com n em / usr / local / bin sempre terá precedência:

alias node='/usr/bin/node'

Agora você pode alternar facilmente entre versões de nós com n <desired node version number>.

Ville
fonte
9

No Linux Mint 17, tentei as duas soluções (criando um link simbólico ou usando o nodejs-legacy pacote) sem êxito.

A única coisa que finalmente funcionou para mim foi usar o 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 nó instalado versão 10.37 e npm 1.4.28. Depois disso, eu poderia instalar pacotes globalmente.

Suzana
fonte
9

Como outras pessoas já mencionaram, vou sugerir não usar "sudo apt-get" para instalar o nó ou qualquer biblioteca de desenvolvimento. Você pode baixar a versão necessária em https://nodejs.org/dist/v6.9.2/ e configurar seu próprio ambiente.

Vou recomendar ferramentas como nvm e n , controlá-lo versão nó. É muito conveniente alternar e trabalhar com esses módulos. https://github.com/creationix/nvm https://github.com/tj/n

Ou escreva bash básico para baixar zip / tar, extraia a pasta de movimentação e crie um link virtual. Sempre que precisar atualizar, aponte o link virtual antigo para a nova versão baixada. Como eu criei para mim, você pode 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
fonte
6

Solução simples a partir daqui

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

Você pode especificar a versão alterando o valor setup_x.x, por exemplo, para setup_5.x

Krzysztof Karolak
fonte
5

Seu sistema não pode detectar o nó do caminho js binário.

1.que nó

2.Em seguida, o nó de link suave para o nójs

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

Estou assumindo que / usr / bin está no seu caminho de execução. Em seguida, você pode testar digitando node ou npm na linha de comando e tudo deve funcionar agora.

geadas
fonte
4

Desinstale a versão do nó que você possui

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

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

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

Agora você pode instalar qualquer versão do nó que desejar e alternar entre as versões.

davide andreazzini
fonte
Para sua informação - qualquer pessoa que utilize o método acima nvm, observe que o pacote nodejs-legacy é v0.10.25. (ou pelo menos, é o que eu vi quando eu tentei.)
JaredH
2

Corrigi-o desvinculando / usr / sbin / node (que está vinculado ao pacote ax25-node), então criei um link para o nodejs usando isso na linha de comando

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

Como pacotes como karma não funcionam com o nome nodejs, no entanto, alteramos a primeira linha do script karma de node para nodejs, mas eu prefiro resolver esse problema de uma vez por todas

Juan Antonio Aguilar
fonte
1

Para mim, a correção foi remover os pacotes node * e também os pacotes npm.

Em seguida, uma nova instalação como:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Jimmy
fonte
sudo apt-get autocleanfaz "o mesmo" quesudo apt-get install autoclean
m3nda
1

O problema não está no instalador,
substitua o nodejs pelo nó ou altere o caminho de / usr / bin / nodejs para / usr / bin / node

Vinayk93
fonte
0

você pode criar um ln -s nodejsnó de link na /usr/bin esperança de que isso resolva seu problema.

Nitish Agarwal
fonte