Pakete können mit dem Node Package Manager in Ubuntu nicht installiert werden

500

Der NodeJS-Interpreter name ( node) unter Ubuntu wurde nodejsaufgrund eines Namenskonflikts mit einem anderen Paket in umbenannt. Hier ist was die Readme. Debian sagt:

Der Upstream-Name für den Interpreter-Befehl Node.js lautet "node". In Debian wurde der Interpreter-Befehl in "nodejs" geändert.

Dies wurde durchgeführt, um eine Namespace-Kollision zu verhindern: Andere Befehle verwenden denselben Namen in ihrem Upstream, z. B. ax25-node aus dem "node" -Paket.

Skripte, die Node.js als Shell-Befehl aufrufen, müssen geändert werden, um stattdessen den Befehl "nodejs" zu verwenden.

Die Verwendung von nodejs macht es jedoch schwierig, Pakete mit zu installieren npm. Die Paketinstallation schlägt mit folgendem Fehler fehl:

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

Wie kann ich npm verständlich machen, dass nodejs bereits auf dem System installiert ist, der Name des Interpreters jedoch unterschiedlich ist?

Sayem
quelle
29
Sie können versuchen, ln -s nodejs nodein /usr/bin. Es ist allerdings eine Art Hack.
Vbo
1
@vbo können Sie das als Antwort hinzufügen - es löst das Problem!
Himel Nag Rana
2
@HimelNagRana ​​Ich habe eine andere (bessere, akzeptierte) Antwort. Mein erster Kommentar wurde ebenfalls in Antwort umgewandelt ( stackoverflow.com/a/21168305/539686 ).
Vbo
4
Verwenden Sie NVM zum Installieren und Verwalten der Node.js-Versionen, github.com/creationix/nvm . Es ist einfach und bequem!
Unitech
2
Ich empfehle diese Lösung sehr: stackoverflow.com/a/38325376/3197383 , um jederzeit und für jede Verwendung die Kontrolle über die Knoten- und npm-Versionen zu erhalten.
Rémi Becheras

Antworten:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Lassen Sie mich zunächst die Situation etwas näher erläutern. Im Sommer 2012 beschlossen die Debian-Betreuer, die ausführbare Datei von Node.js umzubenennen, um eine Art Namespace-Kollision mit einem anderen Paket zu verhindern. Es war eine sehr schwere Entscheidung für das Debian Technical Committee, da es die Abwärtskompatibilität beeinträchtigt.

Das Folgende ist ein Zitat aus dem Resolutionsentwurf des Ausschusses, der in der Debian- Mailingliste veröffentlicht wurde :

  1. Das nodejs-Paket muss geändert werden, um / usr / bin / nodejs bereitzustellen, nicht / usr / bin / node. Das Paket sollte eine Breaks: -Beziehung zu allen Paketen in Debian deklarieren, die auf / usr / bin / node verweisen.

  2. Das Quellpaket von nodejs muss auch ein binäres Paket von nodejs-Legacy mit Priorität bereitstellen: extra, das / usr / bin / node als Symlink zu / usr / bin / nodejs enthält. Kein Paket im Archiv darf von dem NodeJS-Legacy-Paket abhängen oder es empfehlen, das ausschließlich aus Gründen der Upstream-
    Kompatibilität bereitgestellt wird . Dieses Paket deklariert auch eine Konflikt: Beziehung zum Knotenpaket.

<...>

Absatz 2 ist die eigentliche Lösung für das Problem von OP. OP sollte versuchen, dieses Paket zu installieren, anstatt Symlink von Hand auszuführen. Hier ist ein Link zu diesem Paket auf der Debian-Paketindex- Website .

Es kann mit installiert werden sudo apt-get install nodejs-legacy.

Ich habe keine Informationen darüber gefunden, wie NPM-Entwickler das Ganze übernehmen, aber ich denke, das npmPaket wird irgendwann repariert und nodejs-legacywird wirklich zum Vermächtnis.

vbo
quelle
106
Zusammenfassend:sudo apt-get install nodejs-legacy
Alf Eaton
58
Ich mag Antworten, die die Situation gründlich erklären, anstatt nur einen Befehl zur blinden Ausführung zu geben. Dann kann ich diese Informationen in die Kommentare in meinem Umgebungs-Setup-Skript kopieren, damit ich weiß, was in einem Jahr passiert, wenn es nicht funktioniert.
Mnebuerquo
29
Als Person finde ich es unglaublich unpraktisch, dass Node nicht Node ist, sondern Nodejs, nur auf Debian. Es ist wirklich, wirklich, wirklich erstaunlich dumm, solche Entwicklungswerkzeuge zu splittern. Grundsätzlich hat diese Entscheidung eine außergewöhnliche Situation für Debian in JEDEM NODEJS-PAKET geschaffen! Ich habe noch nie davon gehört, was "Knoten" sonst macht, daher fehlt mir jegliches Mitgefühl (
Lodewijk
4
Sofern mir nichts fehlt, war dies keine Namensraumkollision . Es gibt keinen Namespace , es war eine einfache Namenskollision . Name Räume können Sie den gleichen Namen zweimal haben (oder mehr) solange jeder in einem anderen Namen existiert Raum . Für ausführbare Namen unter Linux oder Unix existieren keine solchen "Leerzeichen". Das Nächste ist, dass Ihre $ PATH-Variable mehrere Verzeichnisse enthalten kann und das früheste mit einer übereinstimmenden benannten ausführbaren Datei verwendet wird. (Aber das ist wirklich ganz anders als ein Namespace.)
Bilderstürmer
7
Dies ist sehr ärgerlich, zumal der Namenskonflikt mit einem "Amateur Packet Radio" bestand .
Suzana
113

Versuchen Sie, Node mit NodeJS zu verknüpfen. Finden Sie zuerst heraus, wo sich nodejs befindet

whereis nodejs

Dann Softlink-Knoten zu Knotenjs

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

Ich gehe davon aus, dass sich / usr / bin in Ihrem Ausführungspfad befindet. Dann können Sie testen, indem Sie node oder npm in Ihre Befehlszeile eingeben, und jetzt sollte alles funktionieren.

Leorex
quelle
3
-s erstellt eine symbolische Verknüpfung (was häufig die bevorzugte Wahl ist), keine feste Verknüpfung.
Hyde
20
Dies funktioniert, aber die Antwort von vbo auf die Installation des nodejs-legacyPakets ist einfacher.
Don Kirkby
2
Ich stimme Don Kirkbys Kommentar und der Antwort von vbo zu. Ich denke, dass die Antwort von vbo die ausgewählte Antwort sein sollte.
Modulitos
3
Ich finde es viel bequemer, nur einen Symbolik-Link zu erstellen, anstatt dieselbe Software zweimal zu installieren ...
Frankies
7
Nein, mach nicht mit, es /usr/binsei denn du bist es dpkg. Die richtige Lösung (wenn Sie diesen manuellen Symlinking-Ansatz mögen) besteht darin , den Symlink/usr/local/bin zu erstellen, der für lokale Installationen und Überschreibungen vorgesehen ist. Alles, was Sie manuell tun, /usr/binkann und wird vom Paketmanager überschrieben und / oder verwirrt.
Tripleee
44

Sie können Nodejs auch mit NVM oder Nodejs Version Manager installieren. Die Verwendung eines Versionsmanagers bietet viele Vorteile . Eine davon ist, dass Sie sich über dieses Problem keine Sorgen machen müssen.


Anleitung:


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

Sobald die erforderlichen Pakete installiert sind, können Sie das nvm-Installationsskript von der GitHub-Seite des Projekts herunterladen. Die Versionsnummer kann unterschiedlich sein, aber im Allgemeinen können Sie sie mit der folgenden Syntax herunterladen und installieren:

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

Dadurch wird das Skript heruntergeladen und ausgeführt. Die Software wird in einem Unterverzeichnis Ihres Home-Verzeichnisses unter installiert ~/.nvm. Außerdem werden Ihrer ~/.profileDatei die erforderlichen Zeilen hinzugefügt, um die Datei zu verwenden.

Um Zugriff auf die NVM-Funktionalität zu erhalten, müssen Sie sich abmelden und erneut anmelden. Sie können auch die Datei ~ / .profile als Quelle verwenden, damit Ihre aktuelle Sitzung über die Änderungen informiert ist:

source ~/.profile

Nachdem Sie nvm installiert haben, können Sie isolierte Node.js-Versionen installieren.

Um herauszufinden, welche Versionen von Node.js für die Installation verfügbar sind, können Sie Folgendes eingeben:

nvm ls-remote
. . .

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

Wie Sie sehen können, ist die neueste Version zum Zeitpunkt dieses Schreibens v0.11.14. Sie können das installieren, indem Sie Folgendes eingeben:

nvm install 0.11.14

Normalerweise wechselt nvm zur Verwendung der zuletzt installierten Version. Sie können nvm ausdrücklich anweisen, die gerade heruntergeladene Version zu verwenden, indem Sie Folgendes eingeben:

nvm use 0.11.14

Wenn Sie Node.js mit nvm installieren, wird die ausführbare Datei als Knoten bezeichnet. Sie können die aktuell von der Shell verwendete Version anzeigen, indem Sie Folgendes eingeben:

node -v

Das Comeplete-Tutorial finden Sie hier

Eduardo Dennis
quelle
3
Dies hat auch den obigen Fehler für mich behoben. Es ist viel besser für NodeJS-Entwickler (aus meiner Sicht die gesamten Entwickler, ich bin nicht einer, der in NodeJS arbeitet). Ich habe es benutzt.
Ajeeb.KP
1
Ich musste den NVM-Knoten mit einem Softlink verknüpfen usr/bin/node. So liefsudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
Ich habe stundenlang daran gearbeitet, dies herauszufinden. Dies ist die einzige Lösung, die ich gefunden habe, um zu funktionieren. Vielen Dank.
w3bMak3r
"Vorteile" ist jetzt eine tote Verbindung
Ausflug
20
  1. Installieren Sie nvmzuerst mit:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Führen Sie den Befehl aus

    source ~/.profile
  3. Führen Sie dies jetzt aus und es werden alle installierten oder anderen Versionen von Paketen angezeigt:

    nvm ls-remote
  4. Installierte Pakete werden grün angezeigt. Installieren Sie die gewünschte Version:

    nvm install 6.0.0
  5. Überprüfen Sie, wo nicht installiert ist:

    which node
  6. Überprüfen Sie die aktuelle Version:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Ritesh
quelle
2
Ich empfehle diese Lösung dringend, um jederzeit und für jede Verwendung die Kontrolle über die Knoten- und npm-Versionen zu erhalten.
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

Kombinierte die akzeptierte Antwort mit source ~/.profiledem Kommentar, der gefaltet wurde, und einigen Bereinigungsbefehlen zuvor. Höchstwahrscheinlich müssen Sie auch sudo apt-get install npmnach.

Xiao Peng - ZenUML.com
quelle
12

für mich wurde das Problem gelöst durch,

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
quelle
10

Hier ist ein anderer Ansatz, den ich verwende, da ich n mag, um einfach zwischen Knotenversionen zu wechseln.

Installieren Sie auf einem neuen Ubuntu-System zuerst den 'System'-Knoten:

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

Installieren Sie dann n Modul global:

npm install -g n

Da der Systemknoten zuerst installiert wurde (oben), kann das alternative System verwendet werden, um sauber auf den von n bereitgestellten Knoten zu zeigen . Stellen Sie zunächst sicher, dass das alternative System nichts für den Knoten hat:

update-alternatives --remove-all node

Fügen Sie dann den von n bereitgestellten Knoten hinzu :

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

Als nächstes fügen Sie den vom System bereitgestellten Knoten hinzu (den mit curl installierten):

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

Wählen Sie nun den von n bereitgestellten Knoten über das interaktive Menü aus (wählen Sie /usr/local/bin/nodeaus dem Menü, das mit dem folgenden Befehl angezeigt wird):

update-alternatives --config node

Da /usr/local/binPATH normalerweise eine höhere Priorität hat als /usr/bin, muss der folgende Alias ​​erstellt werden (geben Sie ihn in .bashrc oder .zshrc ein), damit der alternative Systemknoten wirksam wird. Andernfalls hat der mit n in / usr / local / bin installierte Knoten immer Vorrang:

alias node='/usr/bin/node'

Jetzt können Sie mit einfach zwischen Knotenversionen wechseln n <desired node version number>.

Ville
quelle
9

Unter Linux Mint 17 habe ich beide Lösungen (Erstellen eines Symlinks oder Verwenden des nodejs-legacyPakets) ohne Erfolg ausprobiert .

Das einzige, was für mich endlich funktioniert hat, war die Verwendung des ppa von 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

Dieser installierte Knoten Version 10.37 und npm 1.4.28. Danach konnte ich Pakete global installieren.

Suzana
quelle
9

Wie andere Leute bereits erwähnen, werde ich vorschlagen, "sudo apt-get" nicht zu verwenden, um einen Knoten oder eine Entwicklungsbibliothek zu installieren. Sie können die erforderliche Version von https://nodejs.org/dist/v6.9.2/ herunterladen und Ihre eigene Umgebung einrichten.

Ich werde Tools wie nvm und n empfehlen, um Ihre Knotenversion zu verwalten. Es ist sehr bequem, mit diesen Modulen zu wechseln und zu arbeiten. https://github.com/creationix/nvm https://github.com/tj/n

Oder schreiben Sie eine grundlegende Bash, um zip / tar herunterzuladen, den Verschiebungsordner zu extrahieren und einen Softlink zu erstellen. Wenn Sie ein Update benötigen, zeigen Sie einfach mit dem alten Softlink auf die neu heruntergeladene Version. Wie ich es für mich selbst erstellt habe, können Sie auf Folgendes verweisen: 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
quelle
6

Einfache Lösung von hier

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

Sie können die Version angeben, indem Sie den Wert setup_x.x ändern, z. B. in setup_5.x

Krzysztof Karolak
quelle
5

Ihr System kann den Pfadknoten js binär nicht erkennen.

1. welcher Knoten

2. Dann Softlink-Knoten zu NodeJS

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

Ich gehe davon aus, dass sich / usr / bin in Ihrem Ausführungspfad befindet. Dann können Sie testen, indem Sie node oder npm in Ihre Befehlszeile eingeben, und jetzt sollte alles funktionieren.

Frost
quelle
4

Deinstallieren Sie die Knotenversion, die Sie haben

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

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

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

Jetzt können Sie jede gewünschte Version des Knotens installieren und zwischen den Versionen wechseln.

David andreazzini
quelle
Zu nvmIhrer Information: Wenn Sie die oben beschriebene Methode verwenden, beachten Sie, dass das Paket nodejs-Legacy v0.10.25 ist. (oder zumindest habe ich das gesehen, als ich es ausprobiert habe.)
JaredH
2

Ich habe die Verknüpfung zwischen / usr / sbin / node (die mit dem Paket ax25-node verknüpft ist) behoben und dann mithilfe der Befehlszeile eine Verknüpfung zu nodejs erstellt

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

Da Pakete wie Karma nicht mit dem Namen von nodejs funktionieren, jedoch die erste Zeile des Karma-Skripts von node zu nodejs ändern, möchte ich dieses Problem lieber ein für alle Mal beheben

Juan Antonio Aguilar
quelle
1

Für mich war das Update das Entfernen der Node * -Pakete und auch der npm-Pakete.

Dann eine Neuinstallation als:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Jimmy
quelle
sudo apt-get autocleantut "dasselbe" alssudo apt-get install autoclean
m3nda
1

Das Problem besteht nicht darin, im Installationsprogramm
nodejs durch node zu ersetzen oder den Pfad von / usr / bin / nodejs zu / usr / bin / node zu ändern

Vinayk93
quelle
0

Sie können einen Verbindungsknoten erstellen ln -s nodejs, in der /usr/bin Hoffnung, dass dies Ihr Problem löst.

Nitish Agarwal
quelle