问题描述
由于名称与另一个包冲突,Ubuntu上的NodeJS解释器名称(node
)已重命名为nodejs
。这是自述文件。 Debian说:
The upstream name for the Node.js interpreter command is “node”. In Debian the interpreter command has been changed to “nodejs”.
This was done to prevent a namespace collision: other commands use the same name in their upstream, such as ax25-node from the “node” package.
Scripts calling Node.js as a shell command must be changed to instead use the “nodejs” command.
但是,使用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已安装在系统上,但解释器名称有所不同?
最佳解决方法
长话短说:
sudo apt-get install nodejs-legacy
首先让我澄清一下情况。 2012年夏天,Debian维护者决定重命名Node.js可执行文件,以防止某些命名空间与另一个包发生冲突。这对Debian技术委员会来说是非常困难的决定,因为它打破了向后兼容性。
以下是在Debian mailing list上发布的委员会决议草案的引用:
The nodejs package shall be changed to provide /usr/bin/nodejs, not /usr/bin/node. The package should declare a Breaks: relationship with any packages in Debian that reference /usr/bin/node.
The nodejs source package shall also provide a nodejs-legacy binary package at Priority: extra that contains /usr/bin/node as a symlink to /usr/bin/nodejs. No package in the archive may depend on or recommend the nodejs-legacy package, which is provided solely for upstream
compatibility. This package declares shall also declare a Conflicts: relationship with the node package.<…>
第2段是OP问题的实际解决方案。 OP应该尝试安装此软件包,而不是手动执行符号链接。以下是Debian软件包索引website中此软件包的链接。
它可以使用sudo apt-get install nodejs-legacy
安装。
我没有找到任何有关NPM开发人员采用整个事情的信息,但我认为npm
软件包将在某些方面得到修复,nodejs-legacy
将成为真正的遗产。
次佳解决方法
尝试将节点链接到nodejs。首先找出nodejs的位置
whereis nodejs
然后软链接节点到nodejs
ln -s [the path of nodejs] /usr/bin/node
我假设/usr /bin在你的执行路径中。然后你可以通过在你的命令行输入node或npm来测试,现在一切都应该可行。
第三种解决方法
您还可以使用NVM或Nodejs版本管理器安装Nodejs使用版本管理器有很多benefits。其中一个是你不必担心这个问题。
说明:
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时,可执行文件称为节点。您可以通过键入以下内容来查看shell当前使用的版本:
node -v
Comeplete教程可以找到here
第四种方法
-
首先使用以下命令安装
nvm
:curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
-
运行命令
source ~/.profile
-
现在运行此命令将显示所有已安装或其他版本的软件包:
nvm ls-remote
-
已安装的包将为绿色。安装你想要的任何版本:
nvm install 6.0.0
-
检查未安装的位置:
which node
-
检查当前版本:
node -v n=$(which node); n=${n%/bin/node}; chmod -R 755 $n/bin/*; sudo cp -r $n/{bin,lib,share} /usr/local
第五种方法
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
。
第六种方法
对我来说问题解决了,
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
第七种方法
这是我使用的另一种方法,因为我喜欢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
现在使用交互式菜单选择n提供的节点(从以下命令显示的菜单中选择/usr/local/bin/node
):
update-alternatives --config node
最后,由于/usr/local/bin
在PATH中的优先级通常高于/usr/bin
,因此如果要使替代系统节点生效,则必须创建以下别名(输入.bashrc或.zshrc);否则在/usr /local /bin中安装n的节点始终优先:
alias node='/usr/bin/node'
现在,您可以使用n <desired node version number>
轻松切换节点版本。
第八种方法
在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。之后,我可以在全球范围内安装软件包。
第九种方法
正如其他人已经提到的,我建议不要使用“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
第十种方法
来自here的简单解决方案
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash --
sudo apt-get install nodejs
您可以通过更改setup_x.x值来指定版本,例如更改为setup_5.x