Nie można zainstalować pakietów za pomocą menedżera pakietów węzłów w Ubuntu

500

Nazwa interpretera NodeJS ( node) na Ubuntu została zmieniona na z nodejspowodu konfliktu nazw z innym pakietem. Oto co to jest readme. Debian mówi:

Nadrzędna nazwa polecenia interpretera Node.js to „węzeł”. W Debianie komenda interpretera została zmieniona na „nodejs”.

Zrobiono to, aby zapobiec kolizji przestrzeni nazw: inne komendy używają tej samej nazwy w ich górnej części, na przykład ax25-node z pakietu „node”.

Skrypty wywołujące Node.js jako polecenie powłoki muszą zostać zmienione, aby zamiast tego używać polecenia „nodejs”.

Jednak używanie nodejs psuje instalowanie pakietów za pomocą npm. Instalacja pakietu kończy się niepowodzeniem z powodu następującego błędu:

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

Jak sprawić, by npm zrozumiał, że nodejs jest już zainstalowany w systemie, ale nazwa interpretera jest inna?

Sayem
źródło
29
Można próbować ln -s nodejs nodew /usr/bin. Ale to trochę hack.
vbo
1
@vbo możesz dodać to jako odpowiedź - to rozwiązuje problem!
Himel Nag Rana,
2
@HimelNagRana ​​Mam inną (lepszą, zaakceptowaną) odpowiedź. Mój początkowy komentarz został również przekształcony na odpowiedź ( stackoverflow.com/a/21168305/539686 ).
vbo
4
Użyj NVM, aby zainstalować i zarządzać wersjami Node.js, github.com/creationix/nvm , jest to łatwe i wygodne!
Unitech
2
Bardzo polecam to rozwiązanie: stackoverflow.com/a/38325376/3197383, aby uzyskać kontrolę nad wersjami węzła i npm w dowolnym momencie i do dowolnego użycia.
Rémi Becheras

Odpowiedzi:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Przede wszystkim pozwól mi trochę wyjaśnić sytuację. Latem 2012 r. Opiekunowie Debiana postanowili zmienić nazwę pliku wykonywalnego Node.js, aby zapobiec kolizji przestrzeni nazw z innym pakietem. Była to bardzo trudna decyzja dla Komitetu Technicznego Debiana, ponieważ łamie wsteczną kompatybilność.

Oto cytat z projektu rezolucji Komitetu opublikowanego na liście mailowej Debiana :

  1. Pakiet nodejs powinien zostać zmieniony na / usr / bin / nodejs, a nie / usr / bin / node. Pakiet powinien zadeklarować związek Breaks: z dowolnymi pakietami w Debianie, które odwołują się do / usr / bin / node.

  2. Pakiet źródłowy nodejs powinien również zapewniać pakiet binarny nodejs-legacy o priorytecie: dodatkowy, który zawiera / usr / bin / node jako dowiązanie symboliczne do / usr / bin / nodejs. Żaden pakiet w archiwum nie może zależeć ani polecać pakietu nodejs-legacy, który jest dostarczany wyłącznie w celu
    zapewnienia zgodności z poprzednimi wersjami. Ten pakiet deklaruje także deklarację relacji Konflikty: z pakietem węzła.

<...>

Ustęp 2 stanowi rzeczywiste rozwiązanie problemu PO. OP powinien spróbować zainstalować ten pakiet zamiast ręcznie tworzyć dowiązanie symboliczne. Oto link do tego pakietu na stronie indeksu pakietów Debiana .

Można go zainstalować za pomocą sudo apt-get install nodejs-legacy.

Nie znalazłem żadnych informacji o przyjęciu całości przez programistów NPM, ale myślę, że npmpakiet zostanie w pewnym momencie naprawiony i nodejs-legacystanie się naprawdę spuścizną.

vbo
źródło
106
Podsumowując:sudo apt-get install nodejs-legacy
Alf Eaton
58
Lubię odpowiedzi, które dokładnie wyjaśniają sytuację, a nie tylko polecenie wykonania na ślepo. Następnie mogę skopiować te informacje do komentarzy w skrypcie konfiguracji środowiska, aby wiedzieć, co się dzieje za rok, kiedy to nie zadziała.
Mnebuerquo,
29
Jako osoba uważam za niewiarygodnie niewygodne, że węzeł nie jest węzłem, ale nodejsem, tylko na Debianie. To naprawdę, naprawdę, naprawdę niesamowicie głupie narzędzie do tworzenia takich odłamków. Zasadniczo ta decyzja stworzyła wyjątkową sytuację dla Debiana w KAŻDYM PAKIETIE NODEJS! Nigdy nie słyszałem o tym, co „węzeł” robi inaczej, więc brak mi współczucia; (
Lodewijk
4
Chyba że coś mi umknęło, to nie była kolizja przestrzeni nazw . Nie ma przestrzeni nazw , to była prosta kolizja nazw . Przestrzenie nazw umożliwiają dwukrotne (lub więcej) tę samą nazwę, o ile każda z nich istnieje w innej przestrzeni nazw . Nie ma takich „spacji” dla nazw plików wykonywalnych w systemie Linux lub Unix. Najbliższą rzeczą jest to, że możesz mieć wiele katalogów w zmiennej $ PATH, i używany jest najwcześniejszy z pasującym nazwanym plikiem wykonywalnym. (Ale to naprawdę bardzo różni się od przestrzeni nazw.)
iconoclast
7
Jest to bardzo denerwujące, tym bardziej, że konflikt nazw był związany z „amatorskim radiem pakietowym” .
Suzana
113

Spróbuj połączyć węzeł z nodejs. Najpierw dowiedz się, gdzie jest nodejs

whereis nodejs

Następnie miękki link do węzła do nodejs

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

Zakładam, że / usr / bin znajduje się na twojej ścieżce wykonania. Następnie możesz przetestować, wpisując w linii poleceń węzeł lub npm, i wszystko powinno już działać.

leorex
źródło
3
-s tworzy dowiązanie symboliczne (co jest często preferowanym wyborem), a nie dowiązanie twarde.
hyde
20
To działa, ale odpowiedź vbo na instalację nodejs-legacypakietu jest łatwiejsza.
Don Kirkby
2
Popieram komentarz Dona Kirkby'ego i odpowiedź vbo. Myślę, że odpowiedź vbo powinna być wybraną odpowiedzią.
modulitos
3
Uważam, że wygodniej jest po prostu utworzyć link symbolik zamiast instalować dwa razy to samo oprogramowanie ...
frankies
7
Nie. Nie rób tego, /usr/binchyba że jesteś dpkg. Właściwym rozwiązaniem (jeśli podoba Ci się to ręczne podejście do symlinkowania) jest utworzenie dowiązania symbolicznego, w/usr/local/bin którym jest przeznaczone dla lokalnych instalacji i przesłonięć. Wszystko, co robisz ręcznie, /usr/binmoże i zostanie zastąpione przez menedżera pakietów i / lub wprowadzi w błąd.
tripleee,
44

Możesz także zainstalować Nodejs za pomocą NVM lub Nodejs Version Manager. Korzystanie z menedżera wersji ma wiele zalet . Jednym z nich jest to, że nie musisz się martwić tym problemem.


Instrukcje:


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

Po zainstalowaniu wymaganych pakietów można pobrać skrypt instalacyjny nvm ze strony GitHub projektu. Numer wersji może być inny, ale ogólnie można go pobrać i zainstalować przy użyciu następującej składni:

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

Spowoduje to pobranie skryptu i uruchomienie go. Zainstaluje oprogramowanie w podkatalogu katalogu domowego w ~/.nvm. Doda również niezbędne wiersze do ~/.profilepliku, aby go użyć.

Aby uzyskać dostęp do funkcji NVM, musisz się wylogować i zalogować ponownie, lub możesz pobrać plik ~ / .profile, aby bieżąca sesja wiedziała o zmianach:

source ~/.profile

Teraz, gdy masz już zainstalowany NVM, możesz zainstalować izolowane wersje Node.js.

Aby dowiedzieć się, które wersje Node.js są dostępne do instalacji, możesz wpisać:

nvm ls-remote
. . .

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

Jak widać, najnowsza wersja w momencie pisania tego tekstu to v0.11.14. Możesz to zainstalować, wpisując:

nvm install 0.11.14

Zazwyczaj nvm przełączy się na najnowszą wersję. Możesz wyraźnie powiedzieć nvm, aby używał właśnie pobranej wersji, wpisując:

nvm use 0.11.14

Gdy instalujesz Node.js przy użyciu nvm, plik wykonywalny nazywa się node. Możesz zobaczyć wersję aktualnie używaną przez powłokę, wpisując:

node -v

Kompletny samouczek można znaleźć tutaj

Eduardo Dennis
źródło
3
To także naprawiło błąd powyżej dla mnie. Jest to znacznie lepsze dla programisty nodejs (moim zdaniem dla wszystkich programistów nie jestem tym, który pracuje w nodejs). Użyłem tego.
Ajeeb.KP
1
Musiałem miękko połączyć węzeł NVM z usr/bin/node. Tak pobiegłsudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
Pracuję nad tym od wielu godzin. To jedyne rozwiązanie, które znalazłem. Dziękuję Ci.
w3bMak3r 30.03.15
„świadczenia” są teraz martwym ogniwem
wyjazd
20
  1. Zainstaluj nvmnajpierw za pomocą:

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

    source ~/.profile
  3. Teraz uruchom to, a to pokaże wszystkie zainstalowane lub inne wersje pakietów:

    nvm ls-remote
  4. Zainstalowane pakiety będą zielone. Zainstaluj dowolną wersję:

    nvm install 6.0.0
  5. Sprawdź, gdzie nie jest zainstalowany:

    which node
  6. Sprawdź aktualną wersję:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Rytuał
źródło
2
Bardzo polecam to rozwiązanie, aby uzyskać kontrolę nad wersjami węzła i npm w dowolnym momencie i do dowolnego użycia.
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

Połączono zaakceptowaną odpowiedź ze source ~/.profilezłożonym komentarzem i kilkoma wcześniejszymi poleceniami czyszczenia. Najprawdopodobniej będziesz musiał to zrobić sudo apt-get install npmpóźniej.

Xiao Peng - ZenUML.com
źródło
12

dla mnie problem został rozwiązany przez

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
źródło
10

Oto inne podejście, którego używam, ponieważ lubię n do łatwego przełączania między wersjami węzłów.

W nowym systemie Ubuntu najpierw zainstaluj węzeł „systemowy”:

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

Następnie zainstaluj n moduł globalnie:

npm install -g n

Ponieważ węzeł systemowy został zainstalowany jako pierwszy (powyżej), system alternatyw może służyć do czystego wskazywania na węzeł dostarczony przez n . Najpierw upewnij się, że system alternatyw nie ma nic dla węzła:

update-alternatives --remove-all node

Następnie dodaj węzeł podany przez n :

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

Następnie dodaj węzeł dostarczony przez system (ten, który został zainstalowany z curl):

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

Teraz wybierz węzeł dostarczony przez n za pomocą interaktywnego menu (wybierz /usr/local/bin/nodez menu przedstawionego przez następujące polecenie):

update-alternatives --config node

Wreszcie, ponieważ /usr/local/binzwykle ma wyższy priorytet w PATH niż /usr/bin, należy utworzyć następujący alias (wprowadź w .bashrc lub .zshrc), aby węzeł systemu alternatyw miał być skuteczny; w przeciwnym razie węzeł zainstalowany za pomocą nw katalogu / usr / local / bin ma zawsze pierwszeństwo:

alias node='/usr/bin/node'

Teraz możesz łatwo przełączać się między wersjami węzłów za pomocą n <desired node version number>.

Ville
źródło
9

W Linux Mint 17 wypróbowałem oba rozwiązania (utworzenie dowiązania symbolicznego lub użycie nodejs-legacypakietu) bez powodzenia.

Jedyną rzeczą, która w końcu działała dla mnie, było użycie ppa od Chrisa Lei:

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

Ten zainstalowany węzeł w wersji 10.37 i npm 1.4.28. Następnie mogłem instalować pakiety globalnie.

Suzana
źródło
9

Jak już wspominają inni, sugeruję, aby nie używać „sudo apt-get” do instalowania węzła lub jakiejkolwiek biblioteki programistycznej. Możesz pobrać wymaganą wersję ze strony https://nodejs.org/dist/v6.9.2/ i skonfigurować własne środowisko.

Polecę narzędzia takie jak nvm i n , aby zarządzać twoją wersją węzła. Przełączanie i praca z tymi modułami jest bardzo wygodna. https://github.com/creationix/nvm https://github.com/tj/n

Lub napisz podstawową wersję bash, aby pobrać zip / tar, wyodrębnić folder przenoszenia i utworzyć miękki link. Ilekroć musisz zaktualizować, po prostu wskaż stary miękki link do nowej pobranej wersji. Tak jak stworzyłem dla siebie, możesz polecić: 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
źródło
6

Proste rozwiązanie stąd

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

Możesz określić wersję, zmieniając wartość setup_x.x, na przykład na setup_5.x

Krzysztof Karolak
źródło
5

Twój system nie jest w stanie wykryć pliku binarnego js węzła ścieżki.

1. który węzeł

2. Następnie węzeł miękkiego łącza do nodejs

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

Zakładam, że / usr / bin znajduje się na twojej ścieżce wykonania. Następnie możesz przetestować, wpisując w linii poleceń węzeł lub npm, i wszystko powinno już działać.

frostcs
źródło
4

Odinstaluj dowolną wersję węzła

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

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

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

Teraz możesz zainstalować dowolną wersję węzła i przełączać się między wersjami.

David Andreazzini
źródło
FYI - każdy, kto korzysta z powyższej metody, nvmpamiętaj, że pakiet nodejs-legacy to v0.10.25. (a przynajmniej tak to widziałem, gdy próbowałem).
JaredH
2

Naprawiłem to rozłączanie / usr / sbin / node (który jest powiązany z pakietem ax25-node), a następnie utworzyłem link do nodejs używając tego w wierszu poleceń

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

Ponieważ pakiet taki jak karma nie działa z nazwą nodejs, jednak zmieniam pierwszą linię skryptu karmy z węzła na nodejs, ale wolę rozwiązać ten problem raz na zawsze

Juan Antonio Aguilar
źródło
1

Dla mnie poprawką było usunięcie pakietów node *, a także pakietów npm.

Następnie nowa instalacja jako:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Jimmy
źródło
sudo apt-get autocleanrobi „to samo” niżsudo apt-get install autoclean
m3nda
1

Problem nie występuje w instalatorze
zastąp nodejs węzłem lub zmień ścieżkę z / usr / bin / nodejs na / usr / bin / node

Vinayk93
źródło
0

możesz utworzyć ln -s nodejswęzeł łącza w /usr/bin nadziei, że to rozwiąże Twój problem.

Nitish Agarwal
źródło