繁体   English   中英

无法从 root(或 sudo)使用 NVM

[英]Can't use NVM from root (or sudo)

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

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

这个v0.11.8-pre给我带来了一些问题,所以我绝对不想使用它,但是我不能为 root 更改它。

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

我尝试从 root 用户安装 nvm,但出现错误“NVM 已安装”,但从sudo运行时仍然找不到 nvm。 我的问题是什么?

下面的命令列表(来源: digitalocean )似乎解决了这个问题

警告!!!! 在某些情况下,这些命令可能会破坏您的系统! 确保您知道这些命令的作用!!! 有关的

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 上)并设置权限,以便所有用户都可以访问它们。

希望这可以帮助!

我的解决方案是从我使用的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不是一个真正的程序。 这是一个在用户的.profile.bashrc或...中加载的 bash 函数,因此sudo不会像大多数其他程序一样自动从 $PATH 中获取它。

另一个节点版本管理器是nhttps ://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

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

所以输入

$ which nvm

结果会是这样的

/home/abc/mynvm/nvm

现在用sudo再试一次:

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

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

根据自述文件

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

需要 sudo npm 吗?

就我而言,我需要sudo npm run start这需要访问某些需要 root 访问权限的文件。 根据这个问题

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

总共

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

我也有你的问题。 最后我已经解决了它。 这是我的解决方案:

  1. 卸载 nvm 和 nodejs。 以下是一些有用的链接: 卸载 nvm 如果您使用 apt-get 安装了 nodejs,则可以使用命令apt-get purge nodejs将其卸载。
  2. 安装全局 nvm。 请参阅此页面: nvm global 正如它所说,“标准 nvm 已经知道在多用户或 root 环境中工作的困难。”

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

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

我在我的机器上也试过同样的方法,我也有nvm并且我有一个稍微不同的响应:

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

我的猜测是您在 nvm 之外安装了节点 0.11。 通过包管理器甚至源代码

因此,通过 sudo 运行节点会选择这个独立节点。

这有意义还是我错了?

通过扩展 @SimpleJ 解决方案,我创建了一个有用的 bash 脚本,可用于将所有二进制文件从实际的 nvm bin 目录链接到/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

最简单的解决方案可能是直接点击 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 API 安装最新的 node-js,而不需要额外的包清除版本。 所以我一直在寻找 SUDO nvm install-latest-npm。 Mb 这对你有用 - 它确实对我有用,而无需安装/删除任何 apts。 (显然将 YOUR_USER_DIRECTORY 更改为适合您系统的内容)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM