Неправильная версия 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/

Blairg23
источник

Ответы:

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
krubo
источник
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как и ожидалось.

Blairg23
источник
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

Farzad
источник