多版本nodejs管理工具nvm介绍及使用

4862 5 年前
nvm是node的版本管理工具,可以创建不同版本node的隔离环境,避免相互之间包版本干扰。手上有好几个项目,每个项目的需求不同,进而不同项目必须依赖不同版的 NodeJS 运行环境。如果没有一个合适的工具,这个问题将非常棘手。

在我们的日常开发中经常会遇到这种情况:手上有好几个项目,每个项目的需求不同,进而不同项目必须依赖不同版的 NodeJS 运行环境。如果没有一个合适的工具,这个问题将非常棘手。

nvm 应运而生,nvmMac 下的 node版本 管理工具,如果需要管理 Windows 下的 node,官方推荐使用 nvmwnvm-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
分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6