警告:本文已被标记为过期存档,文中所描述的信息已发生改变,请不要使用。

为啥我在 windows 下安装 socket.io 老是报错啊;
pm2 在 windows 下怎么用啊。

无论你是前端,还是 Node.js 的研发人员,你总会看到有人问这样的问题。

或许你比较幸运,公司老大是个有钱的壕,给大家配置的都是清一色的 Mac。但是大多数玩家还停留在 windows 系统下痛苦地挣扎。

本文会介绍如何使用 Vagrant 快速维护一套可靠的本地开发环境,解决不同系统下统一开发环境的问题。

先剧透一下结局:我们会使用 Virtualbox 安装一个 Ubuntu 系统,Ubuntu 系统里安装好 Node.js 及相关环境,通过 Vagrant 配置端口转发、目录挂载和镜像管理。

前言

因为 Vagrant 使用相对简单,主要工作在 Ubuntu 内环境的配置。故本文所有操作在 Mac 系统下进行,Windows 下操作基本差不多。

Step by Step

准备工作

  1. 下载并安装 vagrant
  2. 下载并安装 VirtualBox
  3. 下载最新版本的 Ubuntu Vagrant box 百度网盘,路径为 <ubuntu.box>

初始化环境

  1. 添加 box, vagrant box add ubuntu <ubuntu.box> // 这样你就有了一个 box,名字叫 ubuntu
  2. 进入项目目录 cd <project-directory>
  3. 初始化 vagrant vagrant init ubunut // 用 ubuntu 这个 box 初始化
  4. (optional) 修改 Vagrantfile 来修改部分配置,具体可以配置的内容见后文描述
  5. 启动虚拟机 vagrant up
  6. 登录虚拟机 vagrant ssh

安装 Node.js 环境

编译安装太慢太麻烦,我们选择从 Package Manager 安装 Node.js 环境。

原文见这里 https://github.com/nodesource/distributions,此处仅提供简要的翻译。

因为我们很明智很聪明滴选择了 Ubuntu 作为开发环境,我们可以用最新的 Node.js 5.x,步骤如下

  1. 在项目目录下使用 vagrant ssh 登录虚拟机
  2. curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash - #添加 nodesource 到 package manager
  3. sudo apt-get install -y nodejs build-essential #我们不仅安装最新的 Node.js,我们还安装了编译套件,用于更多需要 node-gyp 安装的模块
  4. 等待,搞定

目录挂载

我们最终的目标是在本地开发代码,在可以正常的运行代码的环境下执行。

通过 vagrant up 命令启动时,我们会发现有一条提示信息,大致意思就是当前开发目录已经被挂载到 Ubuntu 系统下的 /vagrant 目录。

此时,我们就可以用心爱的编辑器在本地开发代码,在 Ubuntu 环境下运行代码调试效果了。

FAQ

关于提供的 Ubuntu

Vagrant 本身是可以从 https://atlas.hashicorp.com/boxes/search 仓库自动下载对应的镜像,但是你懂的,太慢了。所以我下载后提供了一个。

修改端口

编辑 vagrantfile,可以修改端口映射规则。

团队基础环境分发

Vagrant 在最新升级之后,增加了一项安全配置 config.ssh.insert_key,该配置作用是替换 box 内默认的 public key 为新创建的 public key,确保内置的 private key 无法直接访问你的虚拟机。然而还是可以通过用户名密码登录,没什么卵用。

但是这个功能会严重影响到打包基础环境的分发,毕竟 public key 在分发时被改了。

所以,如果你是团队基础环境的搭建者,你在 vagrant init 之后应该编辑生成的 Vagrantfile 并添加 config.ssh.insert_key = false 来避免公钥被替换。

Why Vagrant, Not Docker?

搭建公共环境时,也思考过到底是 Vagrant+VM 还是 Docker。虽然 docker machine 有启动快的优点,更加轻量的优点,但是 TMD 跨平台做得太烂了。最重要的挂载目录本地开发功能,在 windows 下完全搞不定。

两套方案分别花了一天时间来折腾,最后折腾好的是 Vagrant。所以最后决定就是你了。

// 2 b continue