Entornos virtuales, ¿qué son? y ¿para que sirven?

A todos nos ha pasado que viendo/leyendo un tutorial de alguna herramienta o framework hemos escuchado/leído al tutor decir, “este archivo sirve para configurar los entornos de la aplicación” o “estas son dependencias para el entorno de desarrollo”, así que lo primero que cabe preguntarse acá es, ¿qué es un entorno?.

Entorno (Enviroment)

Un entorno, dentro del desarrollo software, es el contexto en el cual este se ejecuta, se refiere a sistema operativo, versión del lenguaje de programación, librerías, complementos, permisos de usuario, etc, es decir, todo aquello que requiera la aplicación para su correcto funcionamiento.

Diferentes entornos

Además de lo antes mencionado, las diferentes etapas de la vida del software hacen que no siempre se requiera que este se comporte igual, es decir, si está en desarrollo se querrá que brinde más información sobre los errores que puedan ocurrir (porque en teoría es donde con mayor probabilidad deberían hacerse presentes) que cuando se lo mostremos al cliente (producción).

¿Por qué es una buena practica el uso de manejadores de entornos virtuales?

Bien sea que estés desarrollando en un equipo personal, en un servidor desarrollo dedicado o desplegando la aplicación en un servidor de producción, es probable que te veas con la necesidad de trabajar en varios proyectos. Proyectos que puedan tener requerimientos similares y por ello entrar en conflicto entre si.

Los manejadores de entornos como Virtualenv en Python, NVM de Nodejs, RVM en Ruby, entre otros, permiten aislar la aplicación de la configuración global del lenguaje de programación, y su correspondiente manejador de paquetes (pip, npm, gem), que exista en el sistema operativo. Así puedes tener una versión de una librería para un proyecto, y la misma librería en otro proyecto con otra versión. Y no solo con librerías y paquetes es útil, puedes tener una versión del lenguaje de programación diferente en cada entorno. En fin puedes definir el contexto de tu aplicación con precisión usando estas herramientas.

Entornos virtuales + manejadores de dependencias = Portabilidad

Todo lo antes mencionado se complementa con la capacidad de poder trasportar este entorno de un computador a otro sin mucho o ningún sufrimiento, todos los lenguajes modernos te permiten definir en un archivo las dependencias de tu proyecto.

No confundir los manejadores de dependencias con entornos virtuales, unos pueden usarse sin los otros pues son proyectos independientes. Es una recomendación personal usarlos en conjunto, pero al final dependerá de la naturaleza de tu proyecto.

Solo por mencionar algunos ejemplos:

  • Bundler + RubyGems (Ruby)
  • PIP + Virtualenv (Python)
  • NPM + NVM (Nodejs)

¿Qué otras combinaciones conoces tu? ¿Cuales me recomendarías probar?

Crear, activar y desactivar entornos virtuales con Virtualenv

Creación

Bien una vez tengamos instalado virtualenenv (las instrucciones para instalarlo puedes encontrarlas en este acá) para crear un entorno virtual solo tenemos que escribir virtualenv y un nombre para nuestro entorno virtual, así:

~$ virtualenv my_enviroment
New python executable in my_enviroment/bin/python
Installing setuptools, pip, wheel...done.

Si queremos especificar una versión de python diferente a la que por defecto nos brinda el sistema operativo, podemos especificarlo con la opción -p de esta manera:

~$ virtualenv my_enviroment3 -p /usr/bin/python3

Activación

El paso anterior nos creará un directorio de con el nombre que le hayamos dado a nuestro entorno virtual, nuestro caso my_enviroment, dentro del el debemos buscar el script activate y pasarlo como argumento al comendo source:

~$ source my_enviroment/bin/activate

si todo va bien el promt de nuestra terminal debe verse similar a esto:

(my_enviroment):~$

cuando el promt se encuentre de esta forma, todo los cambios que hagamos a nuestro entorno python se hará de forma local sin afectar a la instalación del sistema.

Desactivación

Para desactivar el entorno virtual solo debemos escribir la palabra deactivate en nuestra terminal:

(my_enviroment):~$ deactivate

El promt volverá a su forma inicial sin el nombre del entorno virtual entre paréntesis al principio

Cómo instalar Virtualenv en Ubuntu 15.10

Lo primero que tenemos que hacer es instalar el paquete python-setuptools:

~$ sudo aptitude install python-setuptools

Luego con easy_install instalamos pip:

~$ sudo easy_install pip

Después con pip instalamos virtualenv:

~$ sudo pip install virtualenv

Debemos colocar sudo tanto para el comando easy_install como para pip, porque al igual que aptitude realizarán cambios en los directorios del sistema.

con esto ya tenemos instalado virtual en nuestro sistema operativo, listo para usar.