为什么 Vagrant 是最好的开发环境

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在开始一个项目时,以个人开发人员的身份工作提供了一定程度的开发自由度,当需要发展团队时,这种自由度会很快变得复杂。一旦您扩展到多个开发人员,维护一个文档齐全且结构化的开发环境至关重要。在一个糟糕的架构环境中,团队成员对软件开发会有不同的经验和想法,这会导致开发人员之间的摩擦。不同环境之间缺乏一致性使得修复错误和开发功能成为一种令人沮丧的体验,并导致了常用的“在我的机器上工作”的借口。相比之下,一个结构合理且文档化的开发环境可以让每个人都在同一页面上并专注于产品,而不是不断地尝试让事情发挥作用。除了更高效的开发团队之外,结构化的开发环境还可以大大减少新开发人员入职所需的时间(我个人曾在一家公司工作,开发环境花了我第一周的全部时间来正确设置和配置,因为它没有得到适当的记录或管理)。

虽然没有“一刀切”的开发环境,但大多数问题的解决方案都以一致性为中心。这几乎总是通过使用虚拟机来处理,但是,它们的设置方式和位置可能大不相同。归根结底,有两个选项决定了这些机器的工作方式和工作方式:本地或远程。在本地开发环境中,开发人员在他们自己的机器上本地运行代码实例,这使他们能够独立工作,而不必依赖集中式服务器。不幸的是,在尝试复制更复杂的生产环境时,本地环境可能会受到限制,尤其是当开发人员在动力不足的机器上工作时。在远程环境中,开发人员直接在远程托管服务器上工作,而不是在本地工作。这具有提供与生产环境完美对等的额外好处,但需要开发人员拥有高速互联网连接来编写和测试即使是对代码库最微不足道的更改。

我见过的最流行的结构化本地开发环境是 Vagrant。 Vagrant 的核心是一个跨平台的虚拟机管理工具,允许您以可重现的方式配置和供应虚拟机。凭借内置的 Puppet 和 Chef 支持,Vagrant 是一种只需一个命令即可设置全新开发环境的绝佳方式。 Vagrant 如此伟大的原因在于,配置文件直接提交到项目的版本控制系统中,而不是传递机器映像,并且动态构建和配置基础机器,这意味着任何可以克隆代码库的开发人员也可以立即鉴于能够启动虚拟机。因为 Vagrant 在虚拟机中运行,虚拟机挂载了它配置的目录,开发人员还可以使用他们熟悉的任何 IDE,这使他们可以花更少的时间学习新工具,而将更多时间专注于产品。

通常,开发人员希望在中央服务器(或一组服务器)上工作,而不是在他们的本地机器上工作。远程开发环境是一个有趣的案例,因为它们可以提供比本地环境更多的功能,并且可以将新开发人员所需的设置量减少到几乎为零。根据组织的规模,这些环境可以由开发或运营团队的人员设置,并且几乎可以在任何地方托管。我见过的两种最常见的远程开发环境设置是共享服务器和私有服务器。在共享服务器环境中,每个开发人员使用他们自己不同的登录名和子域共享同一台机器。对于资源有限且自行托管服务器的组织来说,这是一个很好的解决方案,因为为每个开发人员提供专用的私人服务器可能是不可行的。

如果可用,私有服务器是远程开发环境的完美解决方案,因为它们可以提供与生产环境 100% 的对等,并且就像 Vagrant 一样,只需单击一个按钮即可启动。然而,私人服务器的最大问题是需要互联网连接才能使用它们。在本地环境中,开发人员理论上可以脱离网络工作,但在远程环境中,始终需要高速互联网连接才能完成工作。另一个较小的问题是远程访问并不总是适用于每个 IDE。许多不提供强大的远程访问功能,如果它们提供任何功能,则要求开发人员使用新的 IDE 或编写 hacky 解决方案以使用他们习惯使用的 IDE。

在开发人员可以使用足够强大的机器的完美世界中,我会 100% 推荐 Vagrant。因为它是跨平台的,所以组织可以对个人计算机采用与操作系统无关的方法,并且自动化和简单的设置允许更快的开发人员入职。虽然 Vagrant 可能有一些速度上的缺点,但不需要互联网是一个巨大的好处,从项目可能出错的事情列表中删除“我的互联网已关闭”。

关于作者

Zachary Flower (@zachflower) 是一名自由网络开发人员、作家和博学家。他着眼于简单性和可用性,并努力在构建产品时将最终用户和业务目标牢记在心。