使用NVM管理Nodejs版本

前言

ECMA标准不断推出,nodejs需要不断向标准靠拢,版本迭代很快,新的特性不断加入,所以我们的项目之间可能要使用不同的nodejs版本,比方说:你可能同时进行两个项目,而不同项目所使用的node版本是不一样的;又或者你要用更新的版本是做一些实验。这种情况下,如果没有NVM自己去安装和维护多个版本的node也是一件比较麻烦的事情。这就是NVM的价值。

nvm不支持Windows

本文使用环境是linux,替代解决办法是使用nvm-windows或者nodist, 所有命令是一样的,不同的是安装和设置默认下载仓库, 自行搜索解决。

安装/升级

script方式

1
2
3
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
或者
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash

Git安装(最低要求的git版本是v1.7.0)

  1. 将此repo克隆在用户的根目录中
1
2
cd ~/ 
git clone https://github.com/creationix/nvm.git .nvm
  1. 检查最新版本并激活
1
2
3
4
cd ~/.nvm 
git checkout v0.33.6
# 激活nvm
. nvm.sh
  1. 将一下代码添加到~/.bashrc, ~/.profile, or ~/.zshrc, 以便在登录的时候,自动获取nvm
1
2
3
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

验证安装

1
2
# 如果安装成功,应输出“nvm”, nvm 安装完成后,可能要重启一下 shell 才有 nvm 这个命令。
command -v nvm

配置镜像服务器

nvm 默认是从 http://nodejs.org/dist/ 下载的, 国外服务器, 必然很慢,
好在 nvm 以及支持从镜像服务器下载包

1
2
# 从淘宝镜像下载node v4的最新版本
NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node nvm install 4

如果你不想每次都输入环境变量 NVM_NODEJS_ORG_MIRROR, 建议将一下代码加入到 .bashrc 文件中,这样就会自动从淘宝镜像上下载:

1
2
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
source $NVM_DIR/nvm.sh

配置需要全局安装的npm包

$NVM_DIR文件夹添加default-packages,即可在安装指定node版本后,自动全局安装指定的npm包的最新版本,示例:

1
2
3
4
5
6
# $NVM_DIR/default-packages
express-generator
gulp
node-gyp
pm2
supervisor

使用 .nvmrc 配置项目的 node 版本

如果你的系统设置 node 版本与项目所需的版本不同,则可在项目根目录或其任意父级目录中创建 .nvmrc 文件,在文件中指定使用的 node 版本号.

1
2
3
4
cd <项目根目录>  #进入项目根目录
echo 8 > .nvmrc #添加 .nvmrc 文件
nvm use #无需指定版本号,会自动使用 .nvmrc 文件中配置的版本
node -v #查看 node 是否切换为对应版本

问题

sudo node出现node: command node found ,这是因为nvm安装在当前用户下,在/usr/local/bin/下找不到node命令,可以通过建立软链接的方法解决。

1
2
3
sudo ln -s "$NVM_BIN/node" "/usr/local/bin/node"
sudo ln -s "$NVM_BIN/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_BIN/npx" "/usr/local/bin/npx"

附录

默认别名

  1. node:最新版本 node
  2. iojs:最新版本 io.js
  3. stable:此别名已被弃用,只能真正适用于node v0.12和较早版本。目前,这个别名被node替代。
  4. unstable:这个别名指向node v0.11- 最后一个“不稳定”node,1.0之后,所有节点版本都是稳定的。
  5. 无论何时当nvm连接到https://nodejs.org,它将为所有可用的LTS行重新创建适当的本地别名。这些别名(存储在 $NVM_DIR/alias/lts)下,由nvm管理,您不应该修改,删除或创建这些文件,
    以免导致可能不支持的错误。

命令说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
nvm --help                                  #显示帮助信息
nvm --version   #Print out the installed version of nvm
nvm install [-s] <version>   #下载制定版本的node, [-s]表示强制从源代码安装. 如果.nvmrc存在,则使用.nvmrc

--reinstall-packages-from=<version>   #将指定版本的全局npm包安装到当前版本
--lts   #安装时,只能从LTS(长期支持)版本中进行选择
--lts=<LTS name>   #安装时,只能选择特定LTS版本,参数LTS name可以在$NVM_DIR/alias/lts目录可以查看
--skip-default-packages   #安装时,如果存在default-packages文件,请跳过
--latest-npm   #安装后,尝试升级到node版本上的最新的npm版本
nvm uninstall <version>   #卸载指定版本
nvm uninstall --lts   #卸载长期支持版本,默认使用别名 lts/* , 如果存在.
nvm uninstall --lts=<LTS name>   #卸载指定别名的长期支持版本
nvm use [--silent] <version>   #指定当前使用的版本. 如果存在.nvmrc,则使用.nvmrc
--lts   #参见上面说明
--lts=<LTS name>   #参见上面说明
nvm exec [--silent] <version> [<command>]   #在指定node版本上指定命令. 如果存在.nvmrc,则使用.nvmrc
--lts  #参见上面说明
--lts=<LTS name>  #参见上面说明
nvm run [--silent] <version> [<args>]   #在指定的版本下运行node程序.使用<args>作为参数,如果存在.nvmrc,则使用.nvmrc
--lts   #如果存在lts版本,则使用lts版本的node
--lts=<LTS name>   #如果存在指定别名的lts版本,则使用

nvm current   #当前已激活的node版本
nvm ls   #已安装的node列表
nvm ls <version>   #已安装的指定版本的node列表
nvm ls-remote   #列出可用于安装的远程版本
--lts   #列出可用于安装的远程LST版本
nvm ls-remote <version>   #列出可用于安装的远程版本,指定version number,则给定的<version>匹配
--lts   #列出可用于安装的远程LST版本,指定verison number,则给定的<version>匹配
--lts=<LTS name>   #列出可用于安装的指定的远程LST版本,指定verison number,则给定的<version>匹配
nvm version <version>   #查看本地指定版本的version
nvm version-remote <version>   #查看远程指定版本的version
--lts   #只显示LTS(长期支持)版本的version
--lts=<LTS name>   #只显示指定LTS(长期支持)版本的version
nvm deactivate   #从当前shell中禁用nvm的效果,即去除已激活的node,可以通过nvm use命令重新激活
nvm alias [<pattern>]   #显示以<pattern>开始的所有别名,如果没有指定,则显示所有别名
nvm alias <name> <version>   #为指定的版本设置别名
nvm unalias <name>   #删除名为<name>的别名
nvm install-latest-npm   #升级当前版本node的npm到最新版本
nvm reinstall-packages <version>   #将指定版本的全局npm包安装到当前版本
nvm unload   #从shell中卸载nvm命令, 可以通过 . nvm.sh重新激活
nvm which [<version>]   #显示nvm的node安装路径,也可选择指定node版本. 如果存在.nvmrc,则使用.nvmrc
nvm cache dir   #显示nvm缓存目录的路径
nvm cache clear #清空nvm的缓存目录$NVM_DIR/.cache

参考

NVM官网