不能用 root (或 sudo)使用 NVM

我注意到我的应用程序在从 sudo运行时使用不同版本的 NodeJS。

$ node -v
v0.10.23
$ sudo node -v
v0.11.8-pre

这个 0.11.8-pre给我带来了一些问题,所以我肯定不想使用它,但是我不能为 root 用户更改它。

$ sudo nvm use v0.10.23
sudo: nvm: command not found

我尝试从 root 用户安装 NVM,但是得到错误 “NVM already installed”,但是在从 sudo运行时仍然找不到 NVM。我有什么问题?

115197 次浏览

我在我的机器上也试过同样的方法,我有 nvm,我有一个略微不同的反应:

$ sudo node --version
sudo: node: command not found

我猜测您已经在 nvm 之外安装了节点0.11(通过包管理器,甚至从源代码)

因此,通过 sudo 运行节点将获取这个独立节点。

这说得通吗,还是我搞错了?

您的问题是,当您使用 sudo时,nvm不在路径中。

打字吧

$ which nvm

结果就是

/home/abc/mynvm/nvm

现在用 sudo再试一次:

sudo /home/abc/mynvm/nvm use v0.10.23

我假设您然后遇到了 root 用户找不到0.10.13版本的问题,但是让我们看看下一个错误消息..。

我也遇到过你的问题。最终我解决了它。以下是我的解决方案:

  1. 卸载 nvm 和 nodejs。这里有一些有用的链接: 卸载 nvm。如果使用 apt-get 安装 nodejs,可以使用 apt-get purge nodejs命令卸载它。
  2. 安装全局 nvm。请看这一页: Nvm global。正如它所说,“标准 nvm 在多用户或根环境中工作时存在已知的困难。”

重新启动终端后,可以运行命令 sudo nvm ls

下面的命令列表(源代码: 数字海洋)似乎可以解决这个问题

警告! ! ! ! 在某些情况下,这些命令可能会破坏你的系统! 请确保你知道这些命令是做什么的! ! ! 相关的

n=$(which node); \
n=${n%/bin/node}; \
chmod -R 755 $n/bin/*; \
sudo cp -r $n/{bin,lib,share} /usr/local

上面的命令有点复杂,但它所做的全部工作就是通过 nvm 将活动节点的任何版本复制到 /usr/local/目录(用户安装的全局文件应该位于 linux VPS 上) ,并设置权限,以便所有用户都可以访问它们。

希望这个能帮上忙!

全局安装 nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash

$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3

我的解决方案是从我使用的 nodenpm/usr/local/bin的版本创建符号链接:

sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"

这使得所有用户都可以使用 npmnode

最根本的原因是因为 nvm不是一个真正的程序。它是一个 bash 函数,加载到用户的 .profile.bashrc或... ... 中,所以 sudo不会像大多数其他程序一样自动从 $PATH 中获取它。

另一个节点版本管理器是 n: https://github.com/tj/n。这是一个真正的程序,因此 sudo将通过 $PATH 获取它,而不需要任何修改(只要 sudo的 $PATH 中有 /usr/local/bin)。

sudo npm install -g n  # install 'n' globally
which n                # should be /usr/local/bin/n


sudo n lts             # need sudo to switch node versions
node --version         # v6.10.0
sudo node --version    # v6.10.0

对此最简单的解决方案可能是直接命中 nvm.sh 可执行文件,不管它在哪里。

sudo /home/ubuntu/.nvm/nvm.sh install node

这对我来说很好用(假设这是安装路径)。

完整的安装过程如下所示

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/ubuntu/.nvm"


[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

然后可以运行上面的命令来命中新安装的 nvm.sh

根据 自述

当使用 nvm 时,您不需要 sudo来使用 npm -g全局安装模块,因此不要使用 sudo npm install -g grunt,而是使用 npm install -g grunt

需要 sudo npm 吗?

在我的情况下,我需要 sudo npm run start,它需要访问一些需要根访问的文件,

你不用 sudo。您应该改为 chmod/chown 该文件,以便拥有 nvm 的用户可以访问该文件; 。

总而言之

Nvm 的维护者坚信我们不需要 sudo: P

我只想从 NVM API 安装最新的 node-js,而不需要额外的软件包清除版本。因此,我正在查找 SUDO nvm install-best-npm。Mb 这将为您工作-它肯定为我没有安装/删除任何 apts 工作。(显然要更改您的 _ USER _ DIRECTORY 以获得适合您的系统的内容)

sudo /home/YOUR_USER_DIRECTORY/.nvm/nvm.sh | nvm install-latest-npm

通过扩展@SimpleJ 解决方案,我创建了一个有用的 bash 脚本,它可以用来将所有二进制文件从实际的 nvm bin dir 链接到 /usr/local/bin:

#!/bin/bash
. ~/.nvm/nvm.sh


DIR=$NVM_DIR/versions/node/$(nvm version)/bin/*
DEST=/usr/local/bin


for filename in $DIR; do
filename=$(basename $filename)
DEST_FILE=$DEST/$filename
echo "Copying $filename to $DEST_FILE"
sudo ln -sf "$NVM_DIR/versions/node/$(nvm version)/bin/$filename" "$DEST_FILE"
done