Vagrant + PHPStorm 搭建虚拟化开发环境的实践方案

那么,在开始之前,我们先来思考几个问题 ...

  • 为什么用虚拟机

当考虑需要在本地搭建一个独立的开发环境时,最传统的方式是,在自己的开发机上安装各种项目依赖的软件和库,以便项目能在本地环境中运行起来。而这种看起来最简单直接的方式却可能带来一些意想不到的麻烦:

1. 开发机可能和生产环境之间存在平台上的差异,比如多数开发者喜欢在Mac或者Windows上工作,而服务器多半是Linux。
2. 同时在多个项目工作时,不同项目所依赖的软件版本可能存在冲突,而不同版本的软件在表现上的差异可能导致项目中的错误。
3. 软件的安装方式、安装目录等可能存在差异。
4. 对于对项目还不太熟悉的新成员,要正确安装项目所需要的各种软件及完成配置,往往要花上不少的时间。

而所有这些可能存在的差异,最终可能表现为一个在传统的工作方式里十分常见的问题:It (not) works on my machine!【代码在我的电脑上是(不)正常的】。考虑到这一点,采用虚拟机来提供一个完全无差异的开发环境就成为了一个不错的方案。其实除了以上四点原因外,还有更重要的第五点:

作为一个有轻微洁癖的开发者,我绝不允许在我心爱的Mac上装一大堆乱七八糟的东西,哈哈。

这样,理由就更加充分了。

  • 为什么用Vagrant

回答这个问题,首先我们要知道什么是Vagrant

简单的理解,Vagrant是一个虚拟机(如VirtualBox)的管理工具,通过Vagrant我们能以脚本化的方式创建一个我们需要的虚拟机,包括:设置虚拟机配置(内存,cpu),分配指定的IP地址,安装各种库和软件等。不过,这并不是一篇Vagrant基础教程,所以关于Vagrant的具体用法,还请Google。

所以脚本化的使用方式就是我们选用Vagrant而不是直接使用Virtualbox的根本原因,我们可以通过配置文件定义在Virtualbox中的各种参数,以便可以容易的在团队间共享,而不是直接将镜像拷来拷去。

在Vagrant中有一个重要的概念叫 provisioner, provisioner让我们可以使用一些第三方的运维工具(如:Chef,Puppet等)向虚拟机中安装软件,但是如果使用Chef中现成的开源部署脚本,往往会需要访问一些墙外的资源,这就显得有些尴尬。所以我一般都直接用shell provisioner,也就是自己写shell脚本的方式来完成部署。

一段时间后,团队可以把比较稳定环境导出成一个box,之后就可以以这个box为基础,通过shell provisioner增量地更新环境。

  • 配合IDE使用

Virtualbox仅仅为我们的代码提供了一个虚拟化的运行环境,而开发工具仍然是在我们本地的。下面我们以一个具体的例子(PHP + PHPStorm)来演示如果在JetBrains系列的IDE中与Vagrant结合使用。

  1. 指定Vagrant目录

  1. 指定PHP解释器

这里有两种方式,一个是选择Vagrant并指定Vagrant的工作目录,IDE可以直接连接到虚拟机中。

另一种方式是通过 PHPStorm 提供的 deployment server 来实现,具体方式如下。



执行测试,我们可以发现,PHPStorm 已经可以通过虚拟机中的PHP解释器来运行代码了。

最后,我更推荐使用 deployment server 的方式来连接虚拟机。如果直接勾选 Vagrant 的连接方式,每次调用PHP解释器时,IDE 都会花比较长的时间来与虚拟机建立连接,而如果使用 deployment server SFTP 的方式,仅会在第一次连接虚拟机时花费较长的时间(上传客户端到虚拟机中),之后在使用上几乎与直接调用本地的PHP解释器没有什么差别。

Show Comments