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?

¿Qué es composer?

Ya en un articulo anterior explique cómo instalar composer? pero ¿qué es y para qué sirve?

Como su propia web lo describe, composer es un manejador de dependencias, es decir, todas aquellas clases PHP que hace uso nuestro proyecto y pero no desarrollamos nosotros.

En palabras sencillas

composer-esquema

composer.phar: precompilado ejecutable con el cual interactuamos para instalar, remover y actualizar paquetes.

packagist.org: sitio web y repositorio (sitio desde el cual se descargan los paquetes) principal de composer, nos permite buscar y examinar información de paquetes para usar en nuestro proyecto.

composer.json: archivo de configuración de composer para nuestro proyecto, es donde se especifican los paquetes que necesitamos, se coloca uno por cada proyecto.

Directorio vendor: los paquetes que especificamos en composer.json se descargan en una carpeta de nombre vendor que se coloca al mismo nivel que el archivo composer.json.

vendor/package: cuando intentas instalar un paquetes notarás que su nombre se compone de la estructura palabra1/palabra2, palabra1 es el identificador del autor o también conocido como vendor y palabra2 es el nombre del paquete, ejemplo:

intervention/image

donde intervention es el vendor y image el nombre del paquete. si un autor tiene varios paquetes la primera palabra permanece mientras que la segunda cambiará para cada paquete.

De esta misma forma se descargáramos un paquete por medio del composer, por ejemplo con:

php composer.phar require intervention/image

al terminal el proceso encontraríamos dentro de nuestra carpeta vendor un directorio de nombre intervention y dentro de este otro con el nombre image.

 

Para mayor información sobre las opciones del cli composer.phar recomiendo leer este articulo.