由于与其他包名称冲突,Ubuntu上的NodeJS解释器名称(node)被重命名为NodeJS。这是自述。Debian说:
node .js解释器命令的上游名称是“node”。
在Debian中,解释器命令已更改为"nodejs"。
这样做是为了防止名称空间冲突:使用其他命令
在其上游相同的名称,如ax25-node中的“node”
包中。
作为shell命令调用Node.js的脚本必须改为
使用“nodejs”命令。
然而,使用nodejs会搞砸使用npm安装包的过程。软件包安装失败,报错如下:
Sh: 1: node: not found
此失败可能是由于使用了遗留的二进制"node"
更多解释请阅读/usr/share/doc/nodejs/ readmeDebian
我如何让npm理解nodejs已经安装在系统上,但解释器名称不同?
TL; diana:
sudo apt-get install nodejs-legacy
首先让我澄清一下情况。2012年夏天,Debian维护者决定重命名Node.js可执行文件,以防止与另一个包发生某种名称空间冲突。对于Debian技术委员会来说,这是一个非常艰难的决定,因为它打破了向后兼容性。
以下摘自委员会决议草案,发表在Debian邮件列表中:
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包索引网站上这个包的链接。
可以使用sudo apt-get install nodejs-legacy进行安装。
我还没有发现任何关于NPM开发者采用整个东西的信息,但我认为NPM包会在某个点上被固定,nodejs-legacy会成为真正的遗产。
下面是我使用的另一种方法,因为我喜欢用n来方便在节点版本之间切换。
在一个新的Ubuntu系统上,首先安装“system”节点:
curl -sL https://deb.nodesource.com/setup | sudo bash -
然后全局安装n个模块:
npm install -g n
由于系统节点是先安装的(如上),替代系统可以用来干净地指向n提供的节点。首先确保替代系统没有用于node的东西:
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 <所需节点版本号>的节点版本之间进行切换。