NPM jest niepoprawną wersją najnowszej instalacji Ubuntu (18.04)

18

Normalną instalacją byłoby sudo apt install nodejszainstalowanie Node.js, a następnie sudo apt install npmzainstalowanie Node Package Manager. Jednak po zrobieniu tego, npm -vmówi 3.5.2. Aby przeprowadzić normalną aktualizację, zrobiłbym to sudo npm install -g npm, która aktualizacja do najnowszej wersji (która jest w momencie pisania tego artykułu 6.0.1).

Kiedy to zrobię which npm, dostaję /usr/local/bin/npmjednak aptinstaluje dowiązanie symboliczne na /usr/bin/npm. Jeśli sudo apt purge npmjednak usunę npm, nadal pozostawia wersję npm na /usr/local/bin/npm, jak npm -vmówi -bash: /usr/bin/npm: No such file or directory.

Wiele artykułów mówi o używaniu PPA do instalowania nodejs, ale myślę, że powinien istnieć natywny sposób, aby to zrobić apt.

Instrukcje DigitalOcean dotyczące instalacji normalnie i za pośrednictwem PPA: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-18-04

Instrukcje TecAdmin dotyczące instalacji za pośrednictwem PPA: https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/

Blairg23
źródło

Odpowiedzi:

31

TLDR: Ten problem jest spowodowany Basha buforowanie ścieżkę z npmpoleceniem i można rozwiązać hash -d npm. Nawet nie musisz sobie z tym radzić, apt purgechyba że chcesz.

Wyjaśnienie

Oto moje kroki, aby uzyskać nową npmwersję na Ubuntu. Najpierw wykonaj instalację zgodnie z opisem OP:

$ sudo apt-get install npm
(...apt installation of npm was successful...)
$ npm -v
3.5.2
$ command -v npm
/usr/bin/npm
$ sudo npm install -g npm
(...npm installation of npm was successful...so far, so good)

Widać, że nowa wersja już działa dobrze /usr/local/bin/npm, ale niestety pamięć podręczna Bash nadal ma /usr/bin/npm:

$ /usr/local/bin/npm -v
6.4.1
$ npm -v
3.5.2
$ command -v npm
/usr/bin/npm
$ type npm
npm is hashed (/usr/bin/npm)

Aby rozwiązać problem, usuń go z pamięci podręcznej Bash (zrób to we wszystkich otwartych powłokach):

$ hash -d npm

Teraz nowa wersja działa zgodnie z oczekiwaniami:

$ npm -v
6.4.1
$ command -v npm
/usr/local/bin/npm
krubo
źródło
1
Właściwie podoba mi się ta odpowiedź lepiej niż moja własna.
Blairg23
To rozwiązało mój problem. Dziękuję bardzo. Świetne wyjaśnienie. Jedyne, co jest dla mnie niejasne, to dokładna natura tego, dlaczego wyczyszczenie pamięci podręcznej bash rozwiązuje problem. Czy nie lepiej byłoby usunąć npmzapisany w /usr/bin/npm? Dlaczego wybrana jest odpowiednia wersja po wyczyszczeniu pamięci podręcznej bash, jeśli obie wersje pozostają zainstalowane?
tymczasowego
12

Znalazłem sposób, aby wyczyścić npm sudo apt purge npm, a następnie po prostu odtworzyć dowiązanie symboliczne do instalacji globalnej za pośrednictwem ln -s /usr/local/bin/npm /usr/bin/npm. Po tej poprawce npm -vzwraca 6.0.1zgodnie z oczekiwaniami.

Blairg23
źródło
2
Pracował z Ubuntu 18.04 działającym za pośrednictwem UserLAnd na Androida 6.0.1. Dziękuję Ci! :)
l3l_aze
1
OP powinieneś zaznaczyć to jako odpowiedź.
Robert Munn,
Dziwna rzecz, dla mnie było zupełnie inaczej. Miałem zaktualizowaną wersję /usr/bin/npm, więc wybrałem inną drogę ln -s /usr/bin/npm /usr/local/bin/npm. Dziwne, ale twoja odpowiedź pomogła mi dowiedzieć się, jak rozwiązać problem z nieprawidłową wersją.
LordAnomander
2

Aby mieć kontrolę nad zainstalowaną wersją npm, zawsze używam nvm(kontrola wersji węzła). Możesz zainstalować go za pomocą instrukcji tutaj: https://github.com/creationix/nvm Następnie, wykonując polecenie, zainstaluj najnowszą wersję npm na swoim komputerze:

nvm install node

Farzad
źródło