团队开发的时候,会不时遇到由于开发环境差异造成线上代码出问题。例如Windows下文件名不区分大小写,文件和文件夹权限默认属主用户组可读写,代码直接扔到Linux服务器上可能就是fatal error…虽然这些坑都能通过代码提交后使用自动化构建工具在上线前检测出来,但类似的坑还是越少越好。
不能统一团队用的软硬件(Mac, Windows和Linux基本上各有所好),但统一一下成员所用的开发环境还是比较容易的,代价也比较小。这里介绍一下使用Vagrant来进行跨平台开发。
Vagrant是什么
Vagrant是基于Ruby的开发环境构建工具,主要解决“我电脑上运行没问题”这个过去让人头疼的问题。通过几个简单的命令就能搭建一套统一的开发环境,这就是Vagrant的神奇所在。有了Vagrant,不需要操作虚拟机就能愉快的开发,所以忘掉虚拟机那让人蛋疼的界面操作吧~
当然本人考虑使用Vagrant的主要原因不是环境问题,而是由于之前都是连到线上的服务器敲vim做开发,如果在高铁、飞机这种场合,基本上就做不了事。所以本人是在Win下玩虚拟机,顺带搞搞Vagrant~
基本概念
使用Vagrant有如下一些基本概念:
- box 系统镜像,比如CentOS 7, Ubuntu 14.04等,选择box就是选操作系统和版本。
- provider 提供虚拟化的具体软件。Vagrant不是虚拟机,而是开发环境的构建工具,具体的虚拟化软件由provider负责,比如熟悉的VMware、VirtualBox。
- project 一个开发环境项目,包含项目的根目录和Vagrantfile配置文件
- Vagrantfile Vagrant的配置文件,里面包含虚拟机的box, 网络,共享文件夹,provision脚本等配置
- provision 虚拟机启动后,需要做的一些初始化工作,可以使用常用的shell来完成provision工作
安装
系统为Win 7,虚拟化软件使用开源免费的VirtualBox。
-
安装VirtualBox
到官网下载安装包并安装:https://www.virtualbox.org/
-
安装Vagrant软件
到官网下安装包并安装:https://www.vagrantup.com
启动Vagrant
到官网 https://atlas.hashicorp.com/boxes/search 找一个自己喜欢的系统和版本,点击查看详情,按照提示敲命令即可生成一个虚拟机实例并运行。比如使用CentOS 7作为系统镜像:
vagrant init centos/7 vagrant up --provider virtualbox
虚拟机启动后,通过 vagrant ssh
即可登录虚拟机(无需密码),可以看到虚拟机已经正常运行。如果不放心,打开VirtualBox软件,同样能看到一个虚拟机的实例正在运行。
配置Vagrant
-
除了使用在线的box,还可以使用本地的box。到 http://www.vagrantbox.es/ 网站上下载所需box,然后通过
vagrant box add [title] path-to-file
来添加,然后运行vagrant init [title]
就能使用本地box做系统镜像生成虚拟机。在团队开发或者网络不好时,本地文件可以省去很多事。 -
项目目录下的Vagrantfile使用ruby语法来描述配置,比如box的选择,网络转发。例如进行web开发时,把本地的8080端口转发到虚拟机的8080端口,以方便调试和查看效果:添加
config.vm.network "forwarded_port", guest: 8080, host: 8080
到Vagrantfile内,vagrant reload
重启虚拟机就可看到效果。其他配置可查看Vagrantfile内的注释和说明。 -
默认Vagrant的全局配置文件和位于C盘的~/.vagrant.d目录下,如果C盘空间紧张,可以将文件移动到其他盘符,并添加VAGRANT_HOME环境变量指向新地址。
-
虚拟机运行存放的路径需要到VirtualBox里面设置,例如把VMs的路径更改到D盘,打开VirtualBox的“全局设定”并选择目录即可。
常用命令
Vagrant常用的命令有:
- vagrant box: 管理box
- vagrant init [title] [url] : 初始化一个虚拟机环境
- vagrant up:启动当前项目下配置的虚拟机
- vagrant suspend | resume:暂停和恢复虚拟机
- vagrant halt:关闭虚拟机
- vagrant ssh:ssh登录虚拟机
- vagrant status:查看虚拟机状态
vagrant命令和子命令都可以通过添加 -h 参数查看详细用法。