Неправильная версия NPM в последней версии Ubuntu (18.04)


18

Обычной установкой будет sudo apt install nodejsустановка Node.js, а затем sudo apt install npmустановка Node Package Manager. Однако, после этого, npm -vговорит 3.5.2. Для обычного обновления я бы сделал sudo npm install -g npm, какие обновления до последней версии (которая на момент написания этой статьи была 6.0.1).

Когда я делаю which npm, я получаю /usr/local/bin/npm, однако aptустанавливает символическую ссылку на /usr/bin/npm. Если я sudo apt purge npmудаляю npm, он все равно оставляет версию npm в npm /usr/local/bin/npm, однако npm -vговорит -bash: /usr/bin/npm: No such file or directory.

Во многих статьях говорится, что для установки nodejs нужно использовать PPA, но я думаю, что должен быть встроенный способ сделать это apt.

Инструкции DigitalOcean по установке обычно и через PPA: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-18-04

Инструкция TecAdmin по установке через PPA: https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/

Ответы:


31

TLDR: эта проблема вызвана кэшированием Bash пути к npmкоманде и может быть решена с помощью hash -d npm. Вам даже не нужно иметь дело, apt purgeесли вы не хотите.

объяснение

Здесь были мои шаги для получения новой npmверсии на Ubuntu. Сначала выполните установку, как описано в 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)

Вы можете видеть, что новая версия уже работает нормально /usr/local/bin/npm, но, к сожалению, кэш Bash все еще имеет /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)

Чтобы устранить проблему, удалите ее из кэша Bash (сделайте это во всех открытых оболочках):

$ hash -d npm

Теперь новая версия работает как нужно:

$ npm -v
6.4.1
$ command -v npm
/usr/local/bin/npm

1
Мне этот ответ нравится больше, чем мой собственный.
Blairg23

Это решило мою проблему. Огромное спасибо. Отличное объяснение тоже. Одна вещь, которая мне не ясна, это точная природа того, почему очистка кэша bash решает проблему. Не лучше ли удалить npmсохраненное в /usr/bin/npm? И почему после очистки кэша bash выбирается правильная версия, если обе версии остаются установленными?
temporary_user_name

12

Я нашел способ очистить npm sudo apt purge npm, а затем просто создать символическую ссылку на глобальную установку через ln -s /usr/local/bin/npm /usr/bin/npm. После этого исправления npm -vвозвращается, 6.0.1как и ожидалось.


2
Работал с Ubuntu 18.04, работающим через UserLAnd на Android 6.0.1. Спасибо! :)
l3l_aze

1
OP вы должны пометить это как ответ.
Роберт Манн

Странная вещь, для меня это было совсем по-другому. У меня была обновленная версия /usr/bin/npm, поэтому я пошел противоположным путем, используя ln -s /usr/bin/npm /usr/local/bin/npm. Странно, но ваш ответ помог мне выяснить, как бороться с неправильной версией проблемы.
LordAnomander

2

Чтобы иметь контроль над установленной версией npm, я всегда использую nvm(контроль версий узла). Вы можете установить его , следуя инструкциям здесь: https://github.com/creationix/nvm Затем с помощью следующей команды установите последнюю версию npm на свой компьютер:

nvm install node

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.