I recently switched to Debian. The thing I liked the most about this switch was the possibility to have the development environment as similar as possible to the production one of the many projects I maintain.
Solution 1 – Vagrant
Vagrant helps you to keep per-project virtual environments. It works in conjunction with virtual providers like VirtualBox or VMWare. Vagrant is awesome and it was my first choice. I decided to go with this solution mainly because I didn’t want to downgrade my machine to use older software versions.
Setting up Vagrant is pretty straightforward. One problem I found though was with shared folders and Apache. Vagrant mounts your project’s folder under a /vagrant folder in the virtual machine. Having Apache to read files directly from this folder is not a good idea. In fact, you’d want to change the ownership of files under Apache to www-data. And you cannot chown a shared folder. I was not able to change this default configuration so I decided to mount the same folder under a different name. You can do it in Vagrantfile:
# Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" config.vm.synced_folder ".", "/var/www", owner: 'www-data', group: 'www-data'
It did the trick, virtual machine configured, problem solved.
Solution 2 – APT pinning
I was not completely happy with solution 1. Vagrant is perfect, but I felt like I was using it to solve the wrong problem. That little bit of overhead to startup a virtual machine for every project I had to work on was simply too much. After all this setup was only to keep older versions of two little packages, Apache and PHP.
I decided to study a little bit more on how APT works when it comes to lock packages to specific versions. I found `pinning` as a solution. Very powerful tool, highly configurable. It was enough to add this configuration in my `/etc/apt/preferences`:
Package: *php5* Pin: release n=squeeze Pin-Priority: 1000 Package: *apache2* Pin: release n=squeeze Pin-Priority: 1000
Instead of locking to a specific version I decided to use the release name, which was enough to get the job done.