目前,Vagrant 似乎是最流行的工具,用一种简单方便的方法来创建并管理开发环境。

它可用于 Windows、Mac OS 和一些常见的 Linux 发行版,没有任何其他依赖。Vagrant 以

虚拟机或容器的形式来创建新的开发环境。具体实现取决于虚拟化供应商(provider)。

VirtualBox 是与 Vagrant 安装程序绑定的默认供应商,但也有其他供应商。最有名的供应商

是 VMware、Docker、LXC(Linux Containers)和 Hyper-V。

Vagrant 最重要的配置是一个名为 Vagrantfile 的文件。每个项目的这个文件都应该

是独立的。该文件中最重要的内容如下所示。

• 选择虚拟化供应商。

• 用作虚拟机镜像的 box 文件。

• 选择环境搭建(provisioning)方法。

• 虚拟机(VM)和虚拟机主机之间的共享存储。

• 虚拟机与主机之间的转发端口。

Vagrantfile 的语法语言是 Ruby。示例配置文件提供了用于启动项目的优秀模板,并

且还有详细的文档,因此无需掌握这种语言的知识。用一行命令就可以创建模板配置文件:

vagrant init

这一命令会在当前工作目录下创建一个名为 Vagrantfile 的新文件。通常最好将这

个文件保存在相关项目的根目录下。这个文件已经是一个有效配置,可以利用默认供应商

和基础镜像文件(base box)来创建新的虚拟机。默认不启用环境搭建(provisioning)。添

加完 Vagrantfile 后,利用下面这个命令可以启动新的虚拟机:

vagrant up

初始启动可能需要几分钟的时间,因为需要从网上下载 box 文件。还有一些初始化过

程可能要花费一些时间,这取决于使用的供应商、box 文件和每次打开现有虚拟机时的系

统性能。通常来说,这个过程只需要几秒。一旦启动并运行了新的 Vagrant 环境,开发者可以利用下面这个简短的命令连接 SSH:

vagrant ssh

在项目源代码树中,在 Vagrantfile 之下的任何位置都可以运行这一命令。为了方

便开发人员,我们会在上层目录中查找配置文件,并与相应的虚拟机实例进行匹配。然后

它会建立安全的 shell 连接,可以像任何普通远程机器一样与开发环境进行交互。唯一的区

别在于,整个项目的源代码树(根目录是 Vagrantfile 所在的位置)是在虚拟机文件系

统的/vagrant/目录下。

容器化与虚拟化的对比

容器是全机器虚拟化的替代方法。它是轻量级的虚拟化方法,内核与操作系统允许运

行多个隔离的用户空间实例。容器和主机之间共享操作系统(OS),因此从理论上来说,

这种方法的开销比完全虚拟化要少。这样的容器只包含应用程序代码和系统级的依赖,但

从内部运行进程的角度来看,它看起来像一个完全隔离的系统环境。

软件容器之所以流行,主要是因为 Docker,这是容器的可用实现之一。Docker 可以用

名为 Dockerfile 的简单文本文件的形式来描述其容器。可以创建并存储这样定义的容

器。它还支持增量修改,如果向容器中添加了新的内容,无需从头重新创建。

像 Docker 和 Vagrant 这样不同的工具在功能上似乎有所交叉,但二者主要的区别在于

构建这些工具的原因。如前所述,构建 Vagrant 主要用作开发工具。用一行命令就可以引导

启动整个虚拟机,但无法原样打包并部署或发布。另一方面,Docker 正是为此而创建的,

可以将整个容器打包,发送到生产环境中并部署。如果顺利实现的话,这可以大大改进产

品部署的过程。因此,只有 Docker 和类似的解决方案(例如 Rocket)还要用于生产环境的

部署过程时,在开发过程中使用这些方法才是有意义的。将 Docker 仅用于开发过程的隔离,

可能会产生过大开销,还会有不一致的缺点。

常用的生产力工具

生产力工具是一个模糊的术语。一方面,几乎所有在线发布的开源代码包都是一种生

产力提升工具。它们为某些问题提供了现成的解决方案,因此人们不必再浪费时间(理想

情况下)。另一方面,可以说整个 Python 都是关于生产力的。两种说法都没有错。Python

这种语言的一切及其社区几乎都是为了尽可能高效地开发软件而设计的。

这就建立了一个正反馈循环。由于写代码简单又有趣,所以很多程序员用空闲时间创

建工具,使写代码变得更加简单更加有趣。基于这一事实,这里为生产力工具给出一个非

常主观而且不科学的定义:使开发过程更加简单、更加有趣的一款软件。

从定义来看,生产力工具主要关注开发过程中的某些特定环节,例如测试、调试和包

管理,并不是所构建产品的核心部分。在某些情况下,虽然每天都会用到这些工具,但它

们甚至不会出现在项目的代码库中。

最重要的生产力工具是 pip 和 venv,本章前面已经讨论过了。有些生产力工具可以

解决特定的问题(如分析和测试),本书有专门的章节来介绍。本节主要介绍一些其他章节

没有提到而又十分值得推荐的工具。