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

Say*_*yem 491 ubuntu node.js npm

由于名称与另一个包冲突,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
Run Code Online (Sandbox Code Playgroud)

如何让npm了解nodejs已安装在系统上,但解释器名称有所不同?

vbo*_*vbo 1086

TL; DR:

sudo apt-get install nodejs-legacy
Run Code Online (Sandbox Code Playgroud)

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

以下是委员会决议草案的引用,该草案发布在Debian 邮件列表中:

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

  2. nodejs源包还应在Priority:extra中提供nodejs-legacy二进制包,其中包含/ usr/bin/node作为/ usr/bin/nodejs的符号链接.归档中的任何软件包都不依赖于或推荐nodejs-legacy软件包,该软件包仅用于上游
    兼容性.此包声明还应声明与节点包的冲突:关系.

<...>

第2段是OP问题的实际解决方案.OP应该尝试安装此软件包,而不是手动执行符号链接.以下是Debian软件包索引网站中此软件包的链接.

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

我没有找到任何有关NPM开发人员采用整个事情的信息,但我认为npm软件包将在某些方面得到修复并nodejs-legacy成为真正的遗产.

  • 总结一下:`sudo apt-get install nodejs-legacy` (105认同)
  • 我喜欢能够彻底解释情况的答案,而不仅仅是给出一个盲目执行的命令.然后我可以将这些信息复制到我的环境设置脚本中的注释中,这样我就可以知道从现在开始一年不会发生什么. (57认同)
  • 作为一个人,我发现节点不是节点,而是节点js,仅在Debian上,这令人难以置信.分裂这样的开发工具确实非常非常愚蠢.基本上,这个决定在每个NODEJS包中为Debian创造了一个特殊的情况!我从来没有听说过什么"节点",所以我没有任何同情;( (29认同)
  • 这非常令人讨厌,因为名称冲突与["业余数据包无线电"](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-分布). (7认同)
  • 除非我遗漏了什么,否则这不是名字*空间*碰撞.没有*名称空间*,它是一个简单的*名称*碰撞.名称*空格*允许您具有相同的名称两次(或更多),只要每个名称存在于不同的名称*空格*中.在Linux或Unix中,可执行名称不存在这样的"空格".最接近的是你可以在$ PATH变量中有多个目录,并且使用最早的具有匹配命名可执行文件的目录.(但这与命名空间非常不同.) (4认同)
  • @iconoclast这是一个名称空间冲突,因为它是“ PATH中的可执行文件”名称空间内的冲突。 (2认同)

leo*_*rex 110

尝试将节点链接到nodejs.首先找出nodejs的位置

whereis nodejs
Run Code Online (Sandbox Code Playgroud)

然后软链接节点到nodejs

ln -s [the path of nodejs] /usr/bin/node 
Run Code Online (Sandbox Code Playgroud)

我假设/ usr/bin在你的执行路径中.然后你可以通过在你的命令行输入node或npm来测试,现在一切都应该可行.

  • 这有效,但[vbo的答案](http://stackoverflow.com/a/21171188/4794)安装`nodejs-legacy`包更容易. (20认同)
  • **不.**除非你是'dpkg`,否则不要乱用`/ usr/bin`.正确的解决方案(如果您喜欢这种手动符号链接方法)是在`/ usr/local/bin`**中创建符号链接,该符号链接指定用于本地安装和覆盖.您在`/ usr/bin`中手动执行的任何操作都可以被包管理器覆盖,并且/或者会使其混淆. (7认同)
  • -s创建符号链接(通常是首选),而不是硬链接. (3认同)
  • 我发现创建一个symbolik链接比安装两次相同的软件更方便.... (3认同)
  • 我第二次是Don Kirkby的评论和vbo的回答.我认为vbo的答案应该是选定的答案. (2认同)

Edu*_*nis 42

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


说明:


sudo apt-get update
sudo apt-get install build-essential libssl-dev
Run Code Online (Sandbox Code Playgroud)

安装必备软件包后,可以从项目的GitHub页面下载nvm安装脚本.版本号可能不同,但一般情况下,您可以使用以下语法下载并安装它:

curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh
Run Code Online (Sandbox Code Playgroud)

这将下载脚本并运行它.它会将软件安装到主目录的子目录中~/.nvm.它还将为您的~/.profile文件添加必要的行以使用该文件.

要访问nvm功能,您需要注销并重新登录,或者您可以获取〜/ .profile文件,以便您当前的会话知道更改:

source ~/.profile
Run Code Online (Sandbox Code Playgroud)

现在您已经安装了nvm,您可以安装隔离的Node.js版本.

要找出可用于安装的Node.js版本,可以键入:

nvm ls-remote
. . .

v0.11.10
v0.11.11
v0.11.12
v0.11.13
v0.11.14
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,撰写本文时的最新版本是v0.11.14.您可以通过输入以下命令安装:

nvm install 0.11.14
Run Code Online (Sandbox Code Playgroud)

通常,nvm将切换为使用最近安装的版本.您可以通过键入以下内容明确告诉nvm使用我们刚刚下载的版本:

nvm use 0.11.14
Run Code Online (Sandbox Code Playgroud)

使用nvm安装Node.js时,可执行文件称为节点.您可以通过键入以下内容来查看shell当前使用的版本:

node -v
Run Code Online (Sandbox Code Playgroud)

可以在这里找到Comeplete教程

  • 这也为我修正了错误.对于nodejs开发人员来说要好得多(在我看来,整个开发人员,我不是在nodejs工作的人).我确实使用过它. (3认同)
  • 我一直在努力解决这个问题几个小时..这是我找到的唯一解决方案.谢谢. (2认同)

小智 17

  1. nvm先安装使用:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行命令

    source ~/.profile
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在运行此命令将显示所有已安装或其他版本的软件包:

    nvm ls-remote
    
    Run Code Online (Sandbox Code Playgroud)
  4. 已安装的包将为绿色.安装你想要的任何版本:

    nvm install 6.0.0
    
    Run Code Online (Sandbox Code Playgroud)
  5. 检查未安装的位置:

    which node
    
    Run Code Online (Sandbox Code Playgroud)
  6. 检查当前版本:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
    
    Run Code Online (Sandbox Code Playgroud)

  • 我强烈推荐这个解决方案,以便随时和任何用途控制节点和npm版本. (2认同)

Xia*_*com 13

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
Run Code Online (Sandbox Code Playgroud)

将已接受的答案与source ~/.profile已折叠的评论和之前的一些清理命令相结合.很可能你也需要在sudo apt-get install npm之后.


shr*_*nde 11

对我来说问题解决了,

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
Run Code Online (Sandbox Code Playgroud)


Vil*_*lle 9

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

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

curl -sL https://deb.nodesource.com/setup | sudo bash -
Run Code Online (Sandbox Code Playgroud)

然后全局安装n模块:

npm install -g n
Run Code Online (Sandbox Code Playgroud)

由于首先安装了系统节点(上图),因此替代系统可以用于干净地指向n提供的节点.首先确保替代系统对节点没有任何意义:

update-alternatives --remove-all node
Run Code Online (Sandbox Code Playgroud)

然后添加n提供的节点:

update-alternatives --install /usr/bin/node node /usr/local/bin/node 1
Run Code Online (Sandbox Code Playgroud)

接下来添加系统提供的节点(使用curl安装的节点):

update-alternatives --install /usr/bin/node node /usr/bin/nodejs 2
Run Code Online (Sandbox Code Playgroud)

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

update-alternatives --config node
Run Code Online (Sandbox Code Playgroud)

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

alias node='/usr/bin/node'
Run Code Online (Sandbox Code Playgroud)

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


Suz*_*ana 8

在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
Run Code Online (Sandbox Code Playgroud)

此安装节点版本10.37和npm 1.4.28.之后,我可以在全球范围内安装软件包.


xde*_*akv 8

正如其他人已经提到的,我建议不要使用"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
Run Code Online (Sandbox Code Playgroud)


小智 5

这里简单的解决方案

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash --
sudo apt-get install nodejs
Run Code Online (Sandbox Code Playgroud)

您可以通过更改setup_x.x的值来指定版本,例如更改为setup_5.x


fro*_*tcs 5

您的系统无法检测路径节点 js 二进制文件。

1.哪个节点

2.然后软链接node到nodejs

ln -s [the path of nodejs] /usr/bin/node 
Run Code Online (Sandbox Code Playgroud)

我假设 /usr/bin 在您的执行路径中。然后您可以通过在命令行中输入 node 或 npm 来进行测试,现在一切都应该可以正常工作了。