需求何在

Django应用一般会部署在Linux例如Ubuntu上.使用OS X开发Django应用虽然可行,但终究是有一些适配的问题. 例如Nginx,uWSGI,Celery的配置都不一样,导致没法在本地模拟部署.此外更烦的是由于OS X的编译器环境不一样,很多安装时需要编译的包会出错.

尽管这些问题都可以解决, 但是相当于你要花额外的精力去解决本机上的问题.

一个常见的解决办法是在Mac上通过VirtualBox安装Ubuntu虚拟机来开发. 但是这种做法只是看起来很美. 实际使用过的同学应该会知道这样做很不爽. 例如:

  • 性能太差
  • 虚拟机的配置挺浪费时间
  • 来回切换很麻烦
  • 进入虚拟机全屏工作固然可行,但是经常会错过邮件,IM消息
  • 需要安装和适应两套工具

如果有一个工具,可以提供Linux的环境,但是让你仍然在Mac上工作,是不是很好? Vagrant就是这样的工具.
它其实还是一个虚拟机, 但不同之处在于, 它是一个命令行版本的虚拟机.
其实VirtualBox之类的虚拟机软件提供了命令行接口,只是不太好用罢了.
Vagrant利用了这些命令行接口, 加以包装,适配,让你可以在本机得到一个命令行版本的虚拟机, 是的, 与一个Linux Server完全一样.

关键特性

  • 轻量级的命令行接口的Linux Server环境
  • 共享文件夹,简单直接的实现host和guest之间的文件同步.
  • 端口转发,你可以通过host的浏览器访问虚拟机里某端口上的服务.

有了这两个看似简单的特性, 你就可以做很多有趣的事:
你可以在host上使用熟悉的编辑器和浏览器调试你的网站,而你的网站实际上跑在与服务器一样的Linux Server环境里.

对于文件夹共享, 你可以把自己现有的git库全部共享过去. 这样你的项目就都可以在Linux Server环境下调试了.

对你来说, 主要的改变就是你以后开发需要:

  • vagrant up 开启虚拟机
  • vagrant ssh 登录虚拟机
  • ./manage.py runserver 0.0.0.0:8000 运行Django[稍后解释]

但是得到的好处是, 你再也不需要为了在Mac上安装依赖头疼了, 你也可以轻松的得到Linux Server部署环境, 实现模拟部署以及自动化.

只要理解了Vagrant的思路, 使用起来非常容易. 从Mac迁移过去的成本非常之低,但是可以节省大量的时间, 开发体验也大幅提升.

踩到的坑

尽管体验不错, 使用期间还是踩到了几个坑.

使用过程中发现端口转发没有工作. 研究了下, 发现原来默认的端口转发在Vagrantfile配置文件里是被注释掉的.
取消注释, 并根据Django的习惯,将guest的8000端口映射到host的8000端口.
exit退出虚拟机, vagrant halt停机, vagrant up开机, vagrant ssh再次登录, ./manage.py runserver启动django, 发现还是不行.

Google一番,发现原来API从V1升级到V2后, 配置格式变了.例如端口转发:
V1里是:

config.vm.network :forwarded_port, guest: 8000, host: 8000

V2则是:

config.vm.network "forwarded_port", guest: 8000, host: 8000

此外类似的修改还有一堆. 当然如果你是全新安装的话问题不大.

改完后, 再次退出,重启,进入,测试...居然还是不行...

再次Google, 发现原来host对于guest还是另外一台机器, 你需要这样运行:

./manage.py runserver 0.0.0.0:8000

再次尝试, 终于成功了!

有了Vagrant, 终于解决了Mac上进行Web开发长期以来的环境问题困扰, 你可以同时使用Mac和Linux的长处, 通过文件共享和端口转发, 无缝结合.

Vagrant, 值得拥有.

  • Tee2016-05-23 23:57

    感谢提醒坑,forwarded_port。