在我们的日常开发中经常会遇到这种情况:手上有好几个项目,每个项目的需求不同,进而不同项目必须依赖不同版的 NodeJS 运行环境。如果没有一个合适的工具,这个问题将非常棘手。
nvm
应运而生,nvm
是 Mac
下的 node版本
管理工具,如果需要管理 Windows
下的 node
,官方推荐使用 nvmw
或 nvm-windows
。不过,nvm-windows
并不是 nvm
的简单移植,他们也没有任何关系。但下面介绍的所有命令,都可以在 nvm-windows
中运行。
Windows上安装nodejs版本管理器nvm
首先最重要的是:一定要卸载已安装的 NodeJS
,否则会发生冲突。然后下载 nvm-windows
最新安装包,直接安装即可。连接
- nvm-noinstall.zip: 这个是绿色免安装版本,但是使用之前需要配置
- nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。
- Source code(zip):zip压缩的源码
- Sourc code(tar.gz):tar.gz的源码,一般用于*nix系统
为了方便,所以下载了nvm-set.zip文件。
请注意:在安装nvm-windows
之前,你需要卸载任何现有版本的node.js
。并且需要删除现有的nodejs
安装目录(例如:"C:\Program Files\nodejs’)。因为,nvm生成的symlink(符号链接/超链接)不会覆盖现有的(甚至是空的)安装目录。
你还需要删除现有的npm
安装位置(例如“C:\Users\weiqinl\AppData\Roaming\npm”),以便正确使用nvm安装位置。
确认删除干净以前的nodejs
后,双击执行下载的setup文件,
Next之后,选择同意协议,之后选择nvm的本地安装目录,这里注意,nvm的安装路径名称中最好不要有空格。
我这里选择的是D:\softtool\nvm。点击Next,跳转到设置 Node.js的Symlink,即需要设置nodejs的快捷方式存放的目录。
之后,点击Next-->Install-->Finish完成本次安装。检查是否安装成功,我们可以在新的命令窗口中输入:nvm
。
如果出现nvm版本号和一系列帮助指令,则说明nvm安装成功。
否则,可能会提示nvm: command not found
如果要升级nvm
的话,请重新下载最新的安装程序。并直接运行安装程序,安装到以前的安装目录。它将安全的覆盖需要更新的文件,而无需关心 nodejs
的安装。
OS X/Linux 安装
可以通过curl
或者wget
进行安装,命令如下:
curl方式
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
wget方式
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
如果你系统没有安装git
的话,请先安装git
,安装命令请参考下面
ubuntu系统
sudo apt-get install git
centos
sudo yum install git
安装完后,如果是用xshell
连远程主机的话,先重连一次,不然会发现提示找不到nvm
命令
可能出现依旧提示找不到nvm
命令,那么请使用source
命令,如下:
source ~/.bashrc
如果是zsh的话,请用
source ~/.zshrc
nvm的使用与命令
nvm arch [32|64]
: 显示node
是运行在32位还是64位模式。指定32或64来覆盖默认体系结构。nvm install <version> [arch]
: 该可以是node.js
版本或最新稳定版本latest
。(可选[arch])指定安装32位或64位版本(默认为系统arch)。设置[arch]为all以安装32和64位版本。在命令后面添加--insecure
,可以绕过远端下载服务器的SSL验证。nvm list [available]
: 列出已经安装的node.js版本。可选的available,显示可下载版本的部分列表。这个命令可以简写为nvm ls [available]。nvm on
: 启用node.js版本管理。nvm off
: 禁用node.js版本管理(不卸载任何东西)nvm proxy [url]
: 设置用于下载的代理。留[url]空白,以查看当前的代理。设置[url]为none删除代理。nvm node_mirror [url]
:设置node镜像nvm npm_mirror [url]
:设置npm镜像,nvm uninstall <version>
: 卸载指定版本的nodejs。nvm use [version] [arch]
: 切换到使用指定的nodejs版本。可以指定32/64位 [arch] 。nvm -use <arch>
:将继续使用所选版本,但根据提供的值切换到32/64位模式的 < arch >nvm root [path]
: 设置 nvm 存储node.js不同版本的目录 ,如果未设置,将使用当前目录。nvm version
: 显示当前运行的nvm版本,可以简写为nvm v
安装多版本 node/npm
例如,我们要安装4.2.2版本,可以用如下命令:
nvm install 4.2.2
nvm 遵守语义化版本命名规则。例如,你想安装最新的 4.2 系列的最新的一个版本的话,可以运行:
nvm install 4.2
nvm 会寻找 4.2.x 中最高的版本来安装。
你可以通过以下命令来列出远程服务器上所有的可用版本:
nvm ls-remote
Windows 的话,就是:
nvm ls available
在不同版本间切换
每当我们安装了一个新版本 Node 后,全局环境会自动把这个新版本设置为默认。
nvm
提供了 nvm use
命令。这个命令的使用方法和 install
命令类似。
例如,切换到 4.2.2:
nvm use 4.2.2
切换到最新的 `4.2.x``:
nvm use 4.2
切换到 iojs:
nvm use iojs-v3.2.0
切换到最新版:
nvm use node
每次执行切换的时候,系统都会把 node 的可执行文件链接放到特定版本的文件上。
我们还可以用 nvm
给不同的版本号设置别名:
nvm alias awesome-version 4.2.2
我们给 4.2.2 这个版本号起了一个名字叫做 awesome-version,然后我们可以运行:
nvm use awesome-version
下面这个命令可以取消别名:
nvm unalias awesome-version
另外,你还可以设置 default 这个特殊别名:
nvm alias default node
使用.nvmrc文件运行
在服务器上很多时候会运行多个应用系统,每个应用系统使用的node
版本是不一样的,老系统用0.12.x
甚至0.10.x
,新系统用了新特新所以用最新的node
版本,都很实际很正常。
为了让不同的应用系统使用各自所需的node
版本运行,我们只需在各应用系统内的根目录里生成一个.nvmrc
文件,在其内写一个版本号,利用nvm run <系统启动文件>
的方式运行系统,即可完成要求。
例如:建个demo的文件夹,在其下写一个app1.js
文件,其内容为:
console.log(process.versions);
只有一行代码,把当前运行的node版本输出到控制台。
与app1.js同级,写一个.nvmrc
文件,其中的版本号写“0”,目的是要在0.12.4
版本下运行,可以用命令:
echo '0' > .nvmrc
我们将当前的node版本切至6,然后运行:
nvm use 6
nvm run app1.js
可以看到运行的node
版本取决于.nvmrc
中写的版本。使用 nvm use
如果项目当前目录下有 .nvmrc
文件,将改变当前项目的 shell
使用的 node
版本与.nvmrc
文件里的保持一致。
通过.nvmrc
作为运行版本配置,用nvm run
命令进行启动的方式可以方便的完成同一个服务器运行多个不同版本的应用系统,非常方便灵活。
列出已安装实例
nvm ls
上面绿色箭头是当前正在使用的版本,下面列出的还有设置过的别名。
在项目中使用不同版本的 Node
我们可以通过创建项目目录中的 .nvmrc
文件来指定要使用的 Node
版本。之后在项目目录中执行 nvm use
即可。.nvmrc
文件内容只需要遵守上文提到的语义化版本规则即可。另外还有个工具叫做 avn
,可以自动化这个过程。
在多环境中,npm该如何使用呢?
每个版本的 Node
都会自带一个不同版本的 npm
,可以用 npm -v
来查看 npm
的版本。全局安装的 npm
包并不会在不同的 Node
环境中共享,因为这会引起兼容问题。它们被放在了不同版本的目录下,例如 ~/.nvm/versions/node/<version>/lib/node_modules</version>
这样的目录。这刚好也省去我们在 Linux
中使用 sudo
的功夫了。因为这是用户的主文件夹,并不会引起权限问题。
但问题来了,我们安装过的 npm
包,都要重新再装一次?幸运的是,我们有个办法来解决我们的问题,运行下面这个命令,可以从特定版本导入到我们将要安装的新版本 Node:
nvm install v5.0.0 --reinstall-packages-from=4.2
其他命令
直接运行特定版本的 Node
nvm run 4.2.2 --version
在当前终端的子进程中运行特定版本的 Node
nvm exec 4.2.2 node --version
确认某个版本Node的路径
nvm which 4.2.2
安装 Node 的其他实现,例如 iojs(一个基于 ES6 的 Node 实现,现在已经和 Node 合并)
nvm install iojs-v3.2.0
快捷命令:
nvm install node 安装最新版 Node
nvm install iojs 安装最新版 iojs
nvm install unstable 安装最新不稳定版本的 Node
nvm 与 n 的区别
node
版本管理工具还有一个是 n
命令,n
命令是作为一个 node
的模块而存在,而 nvm
是一个独立于 node/npm
的外部 shell
脚本,因此 n
命令相比 nvm
更加局限。
由于 npm
安装的模块路径均为 /usr/local/lib/node_modules
,当使用 n
切换不同的 node
版本时,实际上会共用全局的 node/npm
目录。 因此不能很好的满足『按不同 node 版本使用不同全局 node 模块』的需求。
卸载全局安装的 node/npm
在官网下载的 node
安装包,运行后会自动安装在全局目录,使用过程中经常会遇到一些权限问题,所以推荐按照以下方法卸载全局安装的 node/npm
。
首先,打开你 Finder,按 shift+command+G,打开前往文件夹的窗口,分别输入下列目录进去之后删除 node 和 node_modules 相关的文件和文件夹:
注:command+shift+G
:根据路径跳转到/users/
目录文件夹
- 打开 /usr/local/lib,删除 node 和 node_modules 相关的文件和文件夹
- 打开 /usr/local/include,删除 node 和 node_modules 相关的文件和文件夹
- 如果你是使用的 brew install node 安装的 NodeJS,那么你还需要在终端中执行 brew uninstall node 命令来卸载
- 检查你的个人主文件夹下面的所有的 local、lib 以及 include 文件夹,并且删除所有与 node 和 node_modules 相关的文件以及文件夹
- 打开 /usr/local/bin 并删除 node 可执行文件
你可能还需要在你的终端中输入一些额外的指令:
sudo rm /usr/local/bin/npm
sudo rm /usr/local/share/man/man1/node.1
sudo rm /usr/local/lib/dtrace/node.d
sudo rm -rf ~/.npm
sudo rm -rf ~/.node-gyp
sudo rm /opt/local/bin/node
sudo rm /opt/local/include/node
sudo rm -rf /opt/local/lib/node_modules