Impossibile installare i pacchetti utilizzando il gestore pacchetti nodo in Ubuntu


501

Il nome dell'interprete NodeJS ( node) su Ubuntu è stato rinominato a nodejscausa di un conflitto di nomi con un altro pacchetto. Ecco cos'è il readme. Debian dice:

Il nome upstream per il comando interprete Node.js è "nodo". In Debian il comando interprete è stato cambiato in "nodejs".

Ciò è stato fatto per prevenire una collisione dello spazio dei nomi: altri comandi usano lo stesso nome nel loro upstream, come ax25-node dal pacchetto "node".

Gli script che chiamano Node.js come comando shell devono essere modificati per utilizzare invece il comando "nodejs".

Tuttavia, usando nodejs si impone di installare i pacchetti usando npm. L'installazione del pacchetto non riesce con il seguente errore:

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

Come faccio a far capire a npm che nodejs è già installato sul sistema ma il nome dell'interprete è diverso?


29
Si può cercare di ln -s nodejs nodea /usr/bin. È una specie di hack però.
Vbo,

1
@vbo puoi aggiungerlo come risposta - risolve il problema!
Himel Nag Rana,

2
@HimelNagRana ​​Ho un'altra risposta (migliore, accettata). Anche il mio commento iniziale è stato trasformato in risposta ( stackoverflow.com/a/21168305/539686 ).
vbo

4
Usa NVM per installare e gestire le versioni di Node.js, github.com/creationix/nvm , è facile e conveniente!
Unitech,

2
Consiglio vivamente questa soluzione: stackoverflow.com/a/38325376/3197383 per ottenere il controllo delle versioni nodo e npm in qualsiasi momento e per qualsiasi utilizzo.
Rémi Becheras,

Risposte:


1094

TL; DR:

sudo apt-get install nodejs-legacy

Prima di tutto, vorrei chiarire un po 'la situazione. Nell'estate 2012 i manutentori di Debian hanno deciso di rinominare il file eseguibile Node.js per prevenire una sorta di collisione dello spazio dei nomi con un altro pacchetto. È stata una decisione molto difficile per il Comitato tecnico Debian, perché interrompe la retrocompatibilità.

Quella che segue è una citazione dalla bozza di risoluzione del Comitato, pubblicata nella mailing list Debian :

  1. Il pacchetto nodejs deve essere modificato per fornire / usr / bin / nodejs, non / usr / bin / node. Il pacchetto dovrebbe dichiarare una relazione Breaks: con qualsiasi pacchetto in Debian che faccia riferimento a / usr / bin / node.

  2. Il pacchetto sorgente nodejs deve anche fornire un pacchetto binario nodejs-legacy su Priorità: extra che contiene / usr / bin / node come collegamento simbolico a / usr / bin / nodejs. Nessun pacchetto nell'archivio può dipendere o raccomandare il pacchetto nodejs-legacy, che è fornito esclusivamente per la
    compatibilità a monte . Questo pacchetto dichiara inoltre deve dichiarare un conflitto: relazione con il pacchetto nodo.

<...>

Il paragrafo 2 è la soluzione effettiva al problema del PO. OP dovrebbe tentare di installare questo pacchetto invece di eseguire manualmente il collegamento simbolico. Ecco un link a questo pacchetto nel sito Web dell'indice dei pacchetti Debian .

Può essere installato usando sudo apt-get install nodejs-legacy.

Non ho trovato alcuna informazione sull'adozione del tutto da parte degli sviluppatori NPM, ma penso che il npmpacchetto verrà risolto su un certo punto e nodejs-legacydiventerà davvero legacy.


106
Riassumendo:sudo apt-get install nodejs-legacy
Alf Eaton,

58
Mi piacciono le risposte che spiegano a fondo la situazione piuttosto che dare semplicemente un comando per eseguire alla cieca. Quindi posso copiare queste informazioni nei commenti nello script di installazione del mio ambiente in modo da sapere cosa succede tra un anno quando non funziona.
Mnebuerquo,

29
Come persona trovo incredibilmente scomodo che il nodo non sia node, ma invece nodejs, solo su Debian. È davvero, davvero, incredibilmente stupido frammentare strumenti di sviluppo come questo. Fondamentalmente, questa decisione ha creato una situazione eccezionale per Debian in OGNI PACCHETTO NODEJS! Non ho mai sentito parlare di quale "nodo" faccia diversamente, quindi non ho alcuna simpatia; (
Lodewijk,

4
A meno che non mi manchi qualcosa, questa non è stata una collisione dello spazio dei nomi . Non c'è spazio dei nomi , è stata una semplice collisione di nomi . Gli spazi dei nomi consentono di avere lo stesso nome due volte (o più) purché ciascuno esista in uno spazio dei nomi diverso . Non esistono "spazi" di questo tipo per nomi eseguibili in Linux o Unix. La cosa più vicina è che puoi avere più directory nella tua variabile $ PATH e viene usata la prima con un eseguibile chiamato corrispondente. (Ma è davvero molto diverso da uno spazio dei nomi.)
iconoclasta il

7
Questo è molto fastidioso, tanto più perché il conflitto del nome era con una "Radio a pacchetto amatoriale" .
Suzana,

113

Prova a collegare il nodo a nodejs. Per prima cosa scopri dove si trova nodejs

whereis nodejs

Quindi nodo soft link a nodejs

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

Suppongo che / usr / bin sia nel tuo percorso di esecuzione. Quindi puoi testare digitando node o npm nella tua riga di comando e tutto dovrebbe funzionare ora.


3
-s crea un collegamento simbolico (che spesso è la scelta preferita), non un collegamento reale.
hyde,

20
Funziona, ma la risposta di vbo sull'installazione del nodejs-legacypacchetto è più semplice.
Don Kirkby,

2
Secondo il commento di Don Kirkby e la risposta di Vbo. Penso che la risposta di vbo dovrebbe essere la risposta selezionata.
Modulitos,

3
Trovo molto più conveniente creare semplicemente un link symbolik piuttosto che installare due volte lo stesso software ....
frankies,

7
No. Non scherzare /usr/binse non lo sei dpkg. La soluzione corretta (se ti piace questo approccio di collegamento simbolico manuale) è quella di creare il/usr/local/bin collegamento simbolico in cui è designato per le installazioni e le sostituzioni locali. Tutto ciò che fai manualmente /usr/binpuò e verrà sovrascritto dal gestore dei pacchetti e / o lo confonderà.
Tripleee,

44

È inoltre possibile installare Nodejs utilizzando NVM o Nodejs Version Manager. L' uso di un gestore versione offre numerosi vantaggi . Essendo uno di questi, non devi preoccuparti di questo problema.


Istruzioni:


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

Una volta installati i pacchetti dei prerequisiti, è possibile estrarre lo script di installazione nvm dalla pagina GitHub del progetto. Il numero di versione può essere diverso, ma in generale è possibile scaricarlo e installarlo con la sintassi seguente:

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

Questo scaricherà lo script ed eseguirà. Installerà il software in una sottodirectory della home directory in ~/.nvm. Aggiungerà anche le righe necessarie al tuo ~/.profilefile per utilizzare il file.

Per accedere alla funzionalità nvm, è necessario disconnettersi e riconnettersi oppure è possibile eseguire il source del file ~ / .profile in modo che la sessione corrente sia a conoscenza delle modifiche:

source ~/.profile

Ora che hai installato nvm, puoi installare versioni isolate di Node.js.

Per scoprire le versioni di Node.js disponibili per l'installazione, è possibile digitare:

nvm ls-remote
. . .

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

Come puoi vedere, la versione più recente al momento della stesura di questo documento è v0.11.14. Puoi installarlo digitando:

nvm install 0.11.14

Di solito, nvm passerà a utilizzare l'ultima versione installata. Puoi dire esplicitamente a nvm di usare la versione che abbiamo appena scaricato digitando:

nvm use 0.11.14

Quando si installa Node.js utilizzando nvm, l'eseguibile si chiama nodo. Puoi vedere la versione attualmente utilizzata dalla shell digitando:

node -v

Il tutorial comeplete può essere trovato qui


3
Anche questo ha risolto l'errore sopra per me. È molto meglio per lo sviluppatore nodejs (a mio avviso per tutti gli sviluppatori, non sono uno che lavora in nodejs). L'ho usato.
Ajeeb.KP,

1
Ho dovuto collegare delicatamente il nodo NVM a usr/bin/node. Così ha funzionatosudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim il

2
Ho lavorato cercando di capire questo per ore .. Questa è l'unica soluzione che ho trovato per funzionare. Grazie.
w3bMak3r

'benefici' è ormai un link morto
scampagnata

20
  1. Installa nvmprima usando:

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

    source ~/.profile
  3. Ora esegui questo e questo mostrerà tutte le versioni installate o altre versioni dei pacchetti:

    nvm ls-remote
  4. I pacchetti installati saranno in verde. Installa la versione che desideri:

    nvm install 6.0.0
  5. Verifica dove non è installato:

    which node
  6. Controlla la versione attuale:

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

2
Consiglio vivamente questa soluzione per ottenere il controllo del nodo e delle versioni npm in qualsiasi momento e per qualsiasi utilizzo.
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

Combina la risposta accettata con source ~/.profileil commento che è stato piegato e alcuni comandi di pulizia precedenti. Molto probabilmente dovrai anche sudo apt-get install npmdopo.


12

per me il problema è stato risolto da,

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

10

Ecco un altro approccio che uso poiché mi piace n per passare facilmente da una versione all'altra del nodo.

Su un nuovo sistema Ubuntu, installa prima il nodo 'sistema':

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

Quindi installare n modulo a livello globale:

npm install -g n

Poiché il nodo di sistema è stato installato per primo (sopra), il sistema alternativo può essere utilizzato per indicare in modo pulito il nodo fornito da n . Per prima cosa assicurati che il sistema alternativo non abbia nulla per il nodo:

update-alternatives --remove-all node

Quindi aggiungere il nodo fornito da n :

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

Quindi aggiungi il nodo fornito dal sistema (quello che è stato installato con l'arricciatura):

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

Ora seleziona il nodo fornito da n usando il menu interattivo (seleziona /usr/local/bin/nodedal menu presentato dal seguente comando):

update-alternatives --config node

Infine, poiché di /usr/local/binsolito ha una precedenza più alta in PERCORSO rispetto a /usr/bin, è necessario creare il seguente alias (immettere in .bashrc o .zshrc) se il nodo di sistema delle alternative deve essere efficace; altrimenti il ​​nodo installato con n in / usr / local / bin ha sempre la precedenza:

alias node='/usr/bin/node'

Ora puoi passare facilmente tra le versioni dei nodi con n <desired node version number>.


9

Su Linux Mint 17, ho provato entrambe le soluzioni (creando un collegamento simbolico o usando il nodejs-legacypacchetto) senza successo.

L'unica cosa che alla fine ha funzionato per me è stato usare il ppa di 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

Questo nodo installato versione 10.37 e npm 1.4.28. Successivamente, ho potuto installare i pacchetti a livello globale.


9

Come già menzionato da altre persone, suggerirò di non usare "sudo apt-get" per installare il nodo o qualsiasi libreria di sviluppo. Puoi scaricare la versione richiesta da https://nodejs.org/dist/v6.9.2/ e configurare il tuo ambiente.

Consiglierò strumenti come nvm e n , per gestire la versione del tuo nodo. È molto comodo passare e lavorare con questi moduli. https://github.com/creationix/nvm https://github.com/tj/n

Oppure scrivi bash di base per scaricare zip / tar, estrarre la cartella move e creare un collegamento software. Ogni volta che è necessario eseguire l'aggiornamento, è sufficiente puntare il vecchio collegamento software alla nuova versione scaricata. Come ho creato per conto mio, puoi fare riferimento a: 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

6

Soluzione semplice da qui

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

È possibile specificare la versione modificando il valore setup_x.x, ad esempio in setup_5.x


5

Il tuo sistema non è in grado di rilevare il nodo percorso js binario.

1. quale nodo

2. Quindi il nodo soft link a nodejs

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

Suppongo che / usr / bin sia nel tuo percorso di esecuzione. Quindi puoi testare digitando node o npm nella tua riga di comando e tutto dovrebbe funzionare ora.


4

Disinstalla qualunque versione del nodo tu abbia

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

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

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

Ora puoi installare qualunque versione del nodo desideri e passare da una versione all'altra.


Cordiali saluti - chiunque utilizzi il metodo sopra riportato nvm, nota che il pacchetto nodejs-legacy è v0.10.25. (o almeno, è quello che ho visto quando l'ho provato.)
JaredH,

2

L'ho risolto scollegando / usr / sbin / node (che è collegato al pacchetto ax25-node), quindi ho creato un collegamento a nodejs usando questo sulla riga di comando

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

Perché un pacchetto come karma non funziona con il nome nodejs, cambiando comunque la prima riga dello script karma da node a nodejs, ma preferisco risolvere questo problema una volta per tutte


1

Per me la correzione stava rimuovendo i pacchetti nodo * e anche i pacchetti npm.

Quindi una nuova installazione come:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install

sudo apt-get autocleanfa "stesso" disudo apt-get install autoclean
m3nda l'

1

Il problema non è nel programma di installazione:
sostituire nodejs con il nodo o cambiare il percorso da / usr / bin / nodejs a / usr / bin / node



0

puoi creare un ln -s nodejsnodo di collegamento nella /usr/bin speranza che questo risolva il tuo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.