Compartir un proyecto de Vagrant entre diferentes equipos

Compartir un proyecto de Vagrant entre diferentes equipos

Desde que comencé a usar Vagrant para facilitarme el colaborar en el proyecto de robótica móvil en el que participo en mi departamento, no he dejado de emplearlo. Ya sea para desarrollar en ROS, Apache Cordova —antes Phonegap— Wordpress o Qt; se está convirtiendo en una costumbre comenzar siempre preparando mi entorno de trabajo con Vagrant. Para quien no lo conozca y quiera una introducción rápida a su uso, me limitaré a recomendar el fantástico artículo de Elías R.M al respecto.

La única cuestión con la que no terminaba de estar conforme es con lo que ocurre cuando se comparte un mismo proyecto entre diferentes equipos, por ejemplo, porque quiero trabajar tanto en el despacho como en casa. Para que se me entienda, el código fuente obviamente suelo tenerlo controlado con Git pero no el resto de los archivos del proyecto, incluidos los relacionados con Vagrant. Y aunque así fuera y estuviera usando un repositorio centralizado para compartir el código, no sería razonable subir trabajo a medias solo porque ha llegado la hora de irme a casa. Para compartir el entorno de trabajo sin duda son mejores otras herramientas, como Dropbox, Drive, ownCloud o, el que utilizo yo: SeaFile.

Lamentablemente, Vagrant asigna a cada máquina virtual creada un identificador único que almacena en el directorio .vagrant del directorio del proyecto. Si sincronizas, llevándote los archivos del proyecto a otro equipo y haces vagrant up, se genera una nueva máquina virtual con un nuevo identificador al no encontrar Vagrant la que estabas utilizando en el VirtualBox del otro equipo. Obviamente, volverá a pasar lo mismo al volver al equipo inicial, repitiéndose una y otra vez, de forma bastante incómoda, y acumulando en los equipos máquinas virtuales que no volverán a ser usadas por Vagrant.

La brillante solución a este problema ha llegado siguiendo las indicaciones de un comentario en una incidencia en el proyecto de Vagrant en GitHub. Concretamente, me he limitado a añadir lo siguiente a mi archivo ~/.bashrc:

# Vagrant
export VAGRANT_DOTFILE_PATH=".vagrant-$(hostname)";

El resultado es que ahora Vagrant no usa .vagrant para guardar sus archivos sino .vagrant-NOMBRE_DE_MÁQUINA. Por lo que en cada equipo utiliza un directorio diferente que mantiene adecuadamente la referencia correcta a la máquina virtual en ese equipo.

El único pero que se me ocurre a esta solución es que a fecha de hoy —24 de octubre de 2014— la ruta indicada con VAGRANT_DOTFILE_PATH se expande con relación al directorio de trabajo, no al directorio raíz del proyecto, tal y como indica el siguiente comentario en el código fuente del proyecto:

Setup the local data directory. If a configuration path is given, then it is expanded relative to the working directory. Otherwise, we use the default which is expanded relative to the root path — lib/vagrant/environment.rb:158

Luego, si no queremos acabar con un montón de directorios .vagrant-* repartidos por el árbol de directorios de nuestros proyectos, conviene recordar ejecutar el comando vagrant siempre en la raíz del mismo. Por el momento no he podido dar con una solución para este pequeño inconveniente.

Resuelto el problema, va siendo hora de volver al trabajo 😉