Не удается установить пакеты с помощью менеджера пакетов узла в Ubuntu

501

Имя переводчика NodeJS (node ) в Ubuntu было переименовано nodejsиз-за конфликта имен с другим пакетом. Вот что читает. Debian говорит:

Вышестоящее имя для команды интерпретатора Node.js - «узел». В Debian команда интерпретатора была изменена на "nodejs".

Это было сделано для предотвращения конфликта пространства имен: другие команды используют то же имя в своем восходящем потоке, например, ax25-node из пакета "node".

Сценарии, вызывающие Node.js в качестве команды оболочки, должны быть изменены, чтобы вместо них использовать команду "nodejs".

Однако использование nodejs портит установку пакетов с помощью npm. Установка пакета завершается с ошибкой:

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

Как заставить npm понять, что nodejs уже установлен в системе, но имя интерпретатора другое?

Sayem
источник
29
Вы можете попробовать ln -s nodejs nodeв /usr/bin. Это вроде взломать хотя.
Vbo
1
@vbo вы можете добавить это как ответ - это решит проблему!
Химел Наг Рана,
2
@HimelNagRana ​​У меня есть другой (лучше принятый) ответ. Мой первоначальный комментарий также был преобразован в ответ ( stackoverflow.com/a/21168305/539686 ).
vbo
4
Используйте NVM для установки и управления версиями Node.js, github.com/creationix/nvm , это просто и удобно!
Unitech
2
Я настоятельно рекомендую это решение: stackoverflow.com/a/38325376/3197383, чтобы получить контроль над версией узла и npm в любое время и для любого использования.
Реми Бехерас

Ответы:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Прежде всего позвольте мне немного прояснить ситуацию. Летом 2012 года сопровождающие Debian решили переименовать исполняемый файл Node.js, чтобы предотвратить какое-либо столкновение пространства имен с другим пакетом. Это было очень сложное решение для Технического комитета Debian, потому что оно нарушает обратную совместимость.

Ниже приводится цитата из проекта резолюции Комитета, опубликованная в списке рассылки Debian :

  1. Пакет nodejs должен быть изменен для предоставления / usr / bin / nodejs, а не / usr / bin / node. Пакет должен объявить отношение Breaks: с любыми пакетами в Debian, которые ссылаются на / usr / bin / node.

  2. Исходный пакет nodejs также должен предоставлять унаследованный двоичный пакет nodejs с приоритетом: extra, который содержит / usr / bin / node в качестве символической ссылки на / usr / bin / nodejs. Ни один пакет в архиве не может зависеть или рекомендовать пакет nodejs-legacy, который предоставляется исключительно для
    совместимости с вышестоящими версиями . Этот пакет объявляет также должен объявить отношения Конфликты: с пакетом узла.

<...>

Пункт 2 является актуальным решением проблемы ОП. OP должен попытаться установить этот пакет, а не делать символическую ссылку вручную. Вот ссылка на этот пакет на веб-сайте индекса пакетов Debian .

Может быть установлен с помощью sudo apt-get install nodejs-legacy.

Я не нашел никакой информации о принятии всего этого разработчиками NPM, но я думаю, что npmпакет будет исправлен в какой-то момент и nodejs-legacyстанет действительно наследием.

ВБО
источник
106
Подведем итог:sudo apt-get install nodejs-legacy
Альф Итон
58
Мне нравятся ответы, которые объясняют ситуацию полностью, а не просто дают команду выполнить вслепую. Затем я могу скопировать эту информацию в комментарии в моем скрипте установки среды, чтобы я знал, что происходит через год, когда она не работает.
Mnebuerquo
29
Как человек, я нахожу невероятно неудобным, что узел - это не узел, а узел, только в Debian. Это действительно, действительно, действительно удивительно глупо разбивать такие инструменты разработки. По сути, это решение создало исключительную ситуацию для Debian в КАЖДОМ НОДЕЖНОМ ПАКЕТЕ! Я никогда не слышал о том, что «узел» делает иначе, поэтому мне не хватает сочувствия; (
Lodewijk
4
Если я что-то упустил, это не было столкновением пространства имен . Там нет пространства имен , это было простое столкновение имен . Пространства имен позволяют вам иметь одно и то же имя дважды (или более), если каждое из них существует в отдельном пространстве имен . Не существует таких «пробелов» для имен исполняемых файлов в Linux или Unix. Самым близким является то, что вы можете иметь несколько каталогов в переменной $ PATH, и используется самый ранний каталог с совпадающим именем исполняемого файла. (Но это действительно очень отличается от пространства имен.)
иконоборц
7
Это очень раздражает, тем более, что конфликт имен произошел с «любительским пакетным радио» .
Сюзана
113

Попробуйте связать узел с nodejs. Сначала выясните, где находится nodejs

whereis nodejs

Затем узел мягкой ссылки на nodejs

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

Я предполагаю, что / usr / bin находится в вашем пути выполнения. Затем вы можете проверить, набрав в командной строке node или npm, и теперь все должно работать.

Leorex
источник
3
-s создает символическую ссылку (которая часто является предпочтительным выбором), а не жесткую ссылку.
Hyde
20
Это работает, но ответ vbo об установке nodejs-legacyпакета проще.
Дон Киркби
2
Я второй комментарий Дона Киркби и ответ VBO. Я думаю, что ответ VBO должен быть выбранным ответом.
modulitos
3
Я считаю, что гораздо удобнее просто создать ссылку Symbolik, чем дважды устанавливать одно и то же программное обеспечение ....
frankies
7
Нет, не гади, /usr/binесли не будешь dpkg. Правильное решение (если вам нравится этот подход к созданию символических/usr/local/bin ссылок вручную) состоит в создании символической ссылки, в которой предусмотрены локальные установки и переопределения. Все, что вы делаете вручную, /usr/binможет и будет перезаписано менеджером пакетов, и / или запутает это.
tripleee
44

Вы также можете установить Nodejs с помощью NVM или Nodejs Version Manager. Использование менеджера версий дает множество преимуществ . Одним из них является то, что вам не нужно беспокоиться об этой проблеме.


Инструкции:


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

После установки необходимых пакетов вы можете открыть скрипт установки nvm со страницы проекта GitHub. Номер версии может отличаться, но в целом вы можете загрузить и установить его с использованием следующего синтаксиса:

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

Это загрузит скрипт и запустит его. Он установит программное обеспечение в подкаталог вашего домашнего каталога по адресу ~/.nvm. Это также добавит необходимые строки в ваш ~/.profileфайл, чтобы использовать файл.

Чтобы получить доступ к функциональности nvm, вам нужно выйти и снова войти в систему, или вы можете получить файл ~ / .profile, чтобы ваш текущий сеанс знал об изменениях:

source ~/.profile

Теперь, когда у вас установлен nvm, вы можете установить изолированные версии Node.js.

Чтобы узнать версии Node.js, доступные для установки, вы можете набрать:

nvm ls-remote
. . .

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

Как вы можете видеть, самая последняя версия на момент написания этой статьи - v0.11.14. Вы можете установить это, набрав:

nvm install 0.11.14

Обычно nvm переключается на использование последней установленной версии. Вы можете явно указать nvm использовать только что загруженную версию, набрав:

nvm use 0.11.14

Когда вы устанавливаете Node.js с помощью nvm, исполняемый файл называется node. Вы можете увидеть версию, в настоящее время используемую оболочкой, набрав:

node -v

Урок Comeplete можно найти здесь

Эдуардо Деннис
источник
3
Это также исправило ошибку выше для меня. Это намного лучше для разработчика nodejs (на мой взгляд, все разработчики, я не тот, кто работает в nodejs). Я использовал это.
Ajeeb.KP
1
Мне нужно было мягко связать узел nvm с usr/bin/node. Так побежалsudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Джейсон Ким
2
Я работал, пытаясь выяснить это часами. Это единственное решение, которое я нашел, чтобы работать. Спасибо.
w3bMak3r
«выгода» в настоящее время является мертвой ссылка
прогулка
20
  1. Установите nvmсначала используя:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Команда Run

    source ~/.profile
  3. Теперь запустите это, и это покажет все установленные или другие версии пакетов:

    nvm ls-remote
  4. Установленные пакеты будут зеленого цвета. Установите любую версию, которую вы хотите:

    nvm install 6.0.0
  5. Проверьте, где не установлен:

    which node
  6. Проверьте текущую версию:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
Ritesh
источник
2
Я настоятельно рекомендую это решение, чтобы получить контроль над версией узла и npm в любое время и для любого использования.
Реми Бехерас
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

Сочетание принятого ответа со source ~/.profileсложенным комментарием и некоторыми командами очистки перед этим. Скорее всего, вам также нужно будет sudo apt-get install npmпосле.

Сяо Пэн - ZenUML.com
источник
12

для меня проблема была решена,

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

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

В новой системе Ubuntu сначала установите узел system:

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

Затем установите модуль n глобально:

npm install -g n

Поскольку системный узел был установлен первым (см. Выше), альтернативная система может использоваться для точного указания на узел, предоставленный n . Сначала убедитесь, что система альтернатив не имеет ничего для узла:

update-alternatives --remove-all node

Затем добавьте узел, предоставленный n :

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

Затем добавьте узел, предоставленный системой (тот, который был установлен с помощью curl):

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

Теперь выберите узел , предоставленную п с помощью интерактивного меню (выбрать /usr/local/bin/nodeиз меню , представленного следующей командой):

update-alternatives --config node

Наконец, так как /usr/local/bin обычно приоритет в PATH выше /usr/bin, чем в следующем, необходимо создать следующий псевдоним (введите в .bashrc или .zshrc), если альтернативный системный узел должен быть эффективным; в противном случае узел, установленный с n в / usr / local / bin, всегда имеет приоритет:

alias node='/usr/bin/node'

Теперь вы можете легко переключаться между версиями узлов с помощью n <desired node version number>.

Виль
источник
9

В Linux Mint 17 я попробовал оба решения (создание символической ссылки или использование nodejs-legacy пакета).

Единственное, что в итоге сработало для меня, это использование ppa от Криса Ли:

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

Это установленный узел версии 10.37 и npm 1.4.28. После этого я мог устанавливать пакеты по всему миру.

Сюзана
источник
9

Как уже упоминали другие люди, я предлагаю не использовать «sudo apt-get» для установки узла или какой-либо библиотеки разработки. Вы можете скачать нужную версию с https://nodejs.org/dist/v6.9.2/ и настроить собственную среду.

Я буду рекомендовать инструменты, такие как nvm и n , чтобы управлять версией вашего узла. С этими модулями очень удобно переключаться и работать. https://github.com/creationix/nvm https://github.com/tj/n

Или напишите базовый bash для загрузки zip / tar, распакуйте папку перемещения и создайте мягкую ссылку. Всякий раз, когда вам нужно обновить, просто укажите старую программную ссылку на новую загруженную версию. Как я создал для себя, вы можете сослаться на: 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
источник
6

Простое решение отсюда

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

Вы можете указать версию, изменив значение setup_x.x, например на setup_5.x

Кшиштоф Каролак
источник
5

Ваша Система не может обнаружить двоичный путь узла js.

1. какой узел

2. Затем узел мягкой ссылки на nodejs

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

Я предполагаю, что / usr / bin находится в вашем пути выполнения. Затем вы можете проверить, набрав в командной строке node или npm, и теперь все должно работать.

frostcs
источник
4

Удалите любую версию вашего узла

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

установить nvm (менеджер версий узлов) https://github.com/creationix/nvm

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

Теперь вы можете установить любую версию узла и переключаться между версиями.

Дэвид Андреаззини
источник
К вашему сведению - любой, кто использует вышеупомянутый метод, nvmобратите внимание, что пакет nodejs-legacy v0.10.25. (или, по крайней мере, это то, что я увидел, когда попробовал.)
ДжаредH
2

Я исправил это, не связывая / usr / sbin / node (который связан с пакетом ax25-node), затем я создал ссылку на nodejs, используя это в командной строке

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

Поскольку такой пакет, как karma, не работает с именем nodejs, однако меняю первую строку скрипта karma с узла на nodejs, но я предпочитаю решить эту проблему раз и навсегда

Хуан Антонио Агилар
источник
1

Для меня исправлением было удаление пакетов узла *, а также пакетов npm.

Затем новая установка как:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Джимми
источник
sudo apt-get autocleanделает "то же самое", чемsudo apt-get install autoclean
m3nda
1

Проблема не в установщике:
замените nodejs на node или измените путь с / usr / bin / nodejs на / usr / bin / node

Vinayk93
источник
1

Это ваш узел не правильно установлен, сначала вам нужно удалить узел, а затем установить снова. Для установки узла это может помочь вам http://array151.com/blog/nodejs-tutorial-and-set-up/

после этого вы можете легко установить пакеты. Для установки пакетов это может помочь вам

http://array151.com/blog/npm-node-package-manager/

Динеш Джайн
источник
0

Вы можете создать ln -s nodejsузел ссылки в /usr/bin надежде, что это решит вашу проблему.

Нитиш Агарвал
источник