无法在Ubuntu中使用节点软件包管理器安装软件包


500

由于与另一个软件包的名称冲突,nodeUbuntu上的NodeJS解释器名称()已重命名为nodejs。这是自述文件。Debian说:

Node.js解释器命令的上游名称是“ node”。在Debian中,解释器命令已更改为“ nodejs”。

这样做是为了防止名称空间冲突:其他命令在上游使用相同的名称,例如“ node”包中的ax25-node。

必须将调用Node.js作为shell命令的脚本更改为使用“ 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但解释器名称不同?


29
您可以尝试ln -s nodejs node/usr/bin。不过,这有点骇人听闻。
vbo

1
您可以添加@vbo作为答案-它可以解决问题!
Himel Nag Rana 2014年

2
@HimelNagRana我还有一个更好的答案。我的最初评论也被转换为答案(stackoverflow.com/a/21168305/539686)。
vbo 2014年

4
使用NVM来安装和管理Node.js版本,github.com/creationix/nvm,这非常简单和方便!
Unitech 2014年

2
我强烈推荐以下解决方案:stackoverflow.com/a/38325376/3197383 ,以随时随地使用对节点和npm版本的控制权。
雷米Becheras

Answers:


1094

TL; DR:

sudo apt-get install nodejs-legacy

首先,让我澄清一下情况。在2012年夏季,Debian维护者决定重命名Node.js可执行文件,以防止某种名称空间与另一个软件包冲突。对于Debian技术委员会来说,这是非常困难的决定,因为它破坏了向后兼容性。

以下是Debian 邮件列表中公布的委员会决议草案的引文:

  1. 应将nodejs软件包更改为提供/ usr / bin / nodejs,而不是/ usr / bin / node。该软件包应与Debian中任何引用/ usr / bin / node的软件包声明Breaks:关系。

  2. nodejs源程序包还应在Priority:优先级:提供额外的nodejs-legacy二进制程序包,其中包含/ usr / bin / node,作为到/ usr / bin / nodejs的符号链接。归档文件中没有任何软件包可以依赖或推荐nodejs-legacy软件包,该软件包仅出于上游
    兼容性而提供。该包声明还应声明与该节点包的Conflicts:关系。

<...>

第2款是OP问题的实际解决方案。OP应该尝试安装此软件包,而不要手工进行符号链接。这是Debian软件包索引网站中此软件包的链接。

可以使用安装sudo apt-get install nodejs-legacy

我还没有找到有关NPM开发人员采用整件事的任何信息,但是我认为npm程序包将在某个时候被固定并nodejs-legacy成为真正的遗留物。


106
总结一下:sudo apt-get install nodejs-legacy
Alf Eaton

58
我喜欢能彻底解释情况的答案,而不仅仅是给出命令以盲目执行。然后,我可以将该信息复制到我的环境设置脚本中的注释中,这样我就知道一年后当它不起作用时会发生什么。
Mnebuerquo

29
作为一个人,我发现非常麻烦的是,节点不是节点,而是仅在Debian上才是nodejs。分裂这样的开发工具真的非常非常愚蠢。基本上,这个决定在每个NODEJS软件包中为Debian创造了特殊情况!我从来没有听说过“节点”会做什么,所以我没有任何同情心;(
Lodewijk 2014年

4
除非我缺少任何东西,否则这不是名称空间冲突。没有名称空间,这是一个简单的名称冲突。命名空间允许您使用两次(或多次)相同的名称,只要每个名称都存在于不同的命名空间中即可。在Linux或Unix中,不存在用于可执行文件名称的“空格”。最接近的是,您的$ PATH变量中可以有多个目录,并且使用最早的具有匹配的命名可执行文件的目录。(但这确实不同于名称空间。)
iconoclast

7
这非常令人讨厌,甚至更是如此,因为名称冲突与“ Amateur Packet Radio”有关
Suzana

113

尝试将节点链接到nodejs。首先找出nodejs在哪里

whereis nodejs

然后将节点软链接到node.js

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

我假设/ usr / bin在您的执行路径中。然后,您可以通过在命令行中键入node或npm进行测试,并且现在一切正常。


3
-s创建符号链接(通常是首选),而不是硬链接。
海德2014年

20
这行得通,但是vbo安装nodejs-legacy软件包的答案更容易。
唐·柯比

2
我第二次接受Don Kirkby的评论和vbo的回答。我认为vbo的答案应该是选定的答案。
modulitos

3
我发现只创建一个symbolik链接比安装两次相同的软件要方便得多....
frankies

7
不要耍弄用/usr/bin,除非你dpkg。正确的解决方案(如果您喜欢这种手动符号链接方法)是创建/usr/local/bin用于本地安装和替代的符号链接。您手动执行的任何操作都/usr/bin可能会被程序包管理器覆盖,并且/或者会使其混淆。
2015年

44

您也可以使用NVMNodejs版本管理器安装Nodejs。使用版本管理器有很多好处。其中之一就是您不必担心这个问题。


说明:


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

一旦安装了必备软件包,就可以从项目的GitHub页面下拉nvm安装脚本。版本号可能会有所不同,但是通常,您可以使用以下语法下载并安装它:

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

使用nvm安装Node.js时,可执行文件称为node。您可以通过键入以下命令查看外壳当前正在使用的版本:

node -v

完整的教程可以在这里找到


3
这也为我解决了上面的错误。对于nodejs开发人员来说,这要好得多(在我看来,整个开发人员,我不是从事nodejs工作的人)。我确实使用过。
Ajeeb.KP,2015年

1
我需要将nvm节点软链接到usr/bin/node。如此跑sudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim

2
我一直在努力尝试解决这个问题,这是我发现唯一可行的解​​决方案。谢谢。
w3bMak3r 2015年

“好处”现在是一个死链接
短途旅游

20
  1. nvm首先安装使用:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. 运行命令

    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

2
我强烈建议您使用此解决方案来随时随地控制节点和npm版本。
雷米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

将接受的答案与source ~/.profile已折叠的注释和之前的一些清理命令结合在一起。您很可能还需sudo apt-get install npm要这样做。


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

10

这是我使用的另一种方法,因为我喜欢n以便在节点版本之间轻松切换。

在新的Ubuntu系统上,首先安装“ system”节点:

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

然后在全局安装n模块:

npm install -g n

由于系统节点是首先安装的(上方),因此可以使用Alternatives系统明确指向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

现在,使用交互式菜单(从以下命令显示的菜单中进行选择)选择n提供的节点/usr/local/bin/node

update-alternatives --config node

最后,由于/usr/local/binPATH中的优先级通常比优先级高/usr/bin,因此,要使备用系统节点有效,必须创建以下别名(在您的.bashrc或.zshrc中输入);否则,在/ usr / local / bin中安装了n的节点始终优先:

alias node='/usr/bin/node'

现在,您可以使用轻松在节点版本之间切换n <desired node version number>


9

在Linux Mint 17上,我尝试了两种解决方案(创建符号链接或使用 nodejs-legacy程序包)均未成功。

最终对我有用的唯一方法是使用Chris Lea的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/下载所需版本,并设置自己的环境。

我将推荐nvmn之类的工具来管理您的节点版本。切换和使用这些模块非常方便。 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

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进行测试,并且现在一切正常。


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。(或者至少是我尝试时看到的内容。)
JaredH,2016年

2

我修复了它取消链接/ usr / sbin / node(链接到ax25-node包)的问题,然后在命令行上使用此链接创建了到nodejs的链接

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

因为诸如karma之类的软件包不适用于nodejs名称,但是将karma脚本的第一行从node更改为nodejs,但我更愿意一劳永逸地解决此问题


1

对我来说,解决方法是删除node *软件包以及npm软件包。

然后重新安装为:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install

sudo apt-get autocleansudo apt-get install autoclean
m3nda

1

问题不是安装程序
中用节点替换nodejs或将路径从/ usr / bin / nodejs更改为/ usr / bin / node



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.