我注意到我的应用程序在运行时使用了不同版本的 NodeJS
sudo
.
$ 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。我的问题是什么?
我的解决方案是从我使用的
node
和npm
版本创建符号链接/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"
这使得
npm
和 node
对所有用户可用。
下面的命令列表(来源: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 上)并设置权限,以便所有用户可以访问它们。
根本原因是因为
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
时,sudo
不在路径中。
所以输入
$ which nvm
结果会是这样的
/home/abc/mynvm/nvm
现在再试一次
sudo
:
sudo /home/abc/mynvm/nvm use v0.10.23
我假设您随后遇到了 root 用户找不到 0.10.13 版本的问题,但让我们看看下一条错误消息...
我也有你的问题。最后我解决了它。这是我的解决方案:
apt-get purge nodejs
.重启终端后,您可以运行命令
sudo nvm ls
.
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3
通过扩展@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
,但我的反应略有不同:
$ sudo node --version
sudo: node: command not found
我的猜测是你已经在 nvm 之外安装了 node 0.11。 (通过包管理器甚至来自源头)
因此,通过 sudo 运行节点会选择这个独立节点。
这有道理还是我错了?
最简单的解决方案可能是直接点击 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
和node
。
要将它们用作 sudo,我将其添加到超级用户的
.bashrc
文件中:
$ sudo bash -c 'echo $HOME/.bashrc'
/root/.bashrc
要添加到
/root/.bashrc
的内容(替换<your-user>
):
# Lazy load NVM/NPM/Node
lazynvm() {
unset -f nvm node npm
export NVM_DIR=/home/<your-user>/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
}
nvm() {
lazynvm
nvm $@
}
node() {
lazynvm
node $@
}
npm() {
lazynvm
npm $@
}
最简单的方法是制作
PATH
变量以包含您的 /bin
NVM_DIR
位置。这是例子:
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion
添加此行以使 PATH 变量包含来自 NVM 的 Node 二进制文件
export PATH="$NVM_DIR/versions/node/$(nvm version)/bin:$PATH"
希望有帮助。
全局安装 nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash