En Wikipedia podemos leer:

“Las variables de entorno forman un conjunto de valores dinámicos que normalmente afectan al comportamiento de los procesos en una computadora”.

Las variables de entorno pueden definirse como como una colección de claves/valor a las que cualquier persona puede acceder en el proceso actual. Si el proceso se bifurca, sus hijos obtienen una copia del entorno. Puedes acceder usando %ENV en Perl, getenv en C, System.getenv en Java, process.env en Node.js o os.environ en Python. Todos los lenguajes que conozco tienen algún mecanismo para acceder al entorno.

Muchos programas las usan como forma de mecanismo de configuración universal. Todos los sistemas operativos principales soportan variables de entorno y se usan de la misma manera para cada programa. Por otro lado, los archivos de configuración tienen grandes diferencias entre sistemas operativos, lenguajes de programación y frameworks.

Las variables de entorno son un mecanismo de configuración útil porque no requieren que se modifique ningún archivo. Esto significa que puedes reforzar la distinción entre el artefacto y su configuración. El código y la configuración tienen ciclos de vida diferentes y deberían ser gestionados por separado. Como idea, probablemente no quieras almacenar tus secretos de la misma manera y en el mismo lugar donde tienes tu código fuente.

Por estas y otras razones, la metodología twelve-factor app impone el uso de variables de entorno para configurar las aplicaciones.

Configure your application using environment variables - CAPSiDE, architects of the digital society

Un desafío global

Si empiezas a usar variables de entorno en tu código directamente, pronto encontrarás ciertas dificultades. El objeto entorno puede considerarse como una variable global en nuestra aplicación, y somos conscientes que las variables globales son malas.

Por si eso no fuera suficiente motivo, si empiezas a usar variables de entorno en tu código en todas las partes que necesitan configurar su comportamiento, pronto te encontrarás con un problema: no hay manera de obtener una lista exhaustiva de las variables de entorno que usa un programa. Esto puede conllevar:

  1. Que haya variables que nadie sabe que se usan.
  2. Que las variables signifiquen cosas diferentes en diferentes partes del código a causa de (1).

Desde el punto de vista de tus usuarios (o de la persona desplegando la aplicación), no hay manera de saber qué variables de entorno se necesitan o cuáles son valores válidos.

Ten en cuenta que no hay una forma automática de imponer la presencia de una variable específica en el entorno. Esto significa que probablemente recibirás cadenas vacías, valores nulos, indefinidos o lo que tu lenguaje te envíe y tendrás que lidiar manualmente con ello cada vez que necesites acceder a una variable.

Usar variables de entorno también va a complicar las pruebas unitarias de tu código, ya que no son una dependencia explícita. Tendrás que lidiar con el entorno dentro de sus casos de prueba, y puede que hasta añadir alguno que no te aporte valor real.

Configure your application using environment variables - CAPSiDE, architects of the digital society

Obtén lo mejor que el entorno te pueda ofrecer

Estas dificultades, aunque importantes, no son nada que no se pueda manejar. Como fan de esta manera de configurar aplicaciones, me gustaría compartir un par de consejos para un entorno de desarrollo más sano:

  1. Usa un espacio de nombre único para tus variables de entorno.
  2. Usa variables de entorno exclusivamente para inicializar un objeto de configuración.

Muchas herramientas ponen cosas en el entorno, por lo que nombres como USERNAME, DEBUG o PATH son colisiones en potencia. Añade un identificador para tu aplicación al principio de todas las variables de entorno que estés utilizando (por ejemplo, MYAPP_USERNAME). Esto no solo es mas seguro, sino que también te permite identificar más fácilmente qué variables están destinadas a tu aplicación.

Por otro lado, un objeto de configuración es un objeto (preferiblemente inmutable) con una serie de atributos bien definidos, uno por cada variable que quieras usar del entorno. Luego puedes inyectar este objeto (u objetos) a otros como dependencia. Con este enfoque, probablemente resuelvas el principal reto de las variables de entorno: cualquiera sabrá de inmediato qué opciones de configuración tiene disponibles y nadie podrá acceder a una clave que no exista.

Además, si alguna configuración en concreto es imprescindible para ejecutar la aplicación (por ejemplo, una cadena de conexión a una base de datos) puedes hacer que falle al comienzo del flujo de trabajo, al inicializar los objetos de configuración. Tus otros módulos pueden confiar en que toda la configuración estará ahí con la forma esperada, reduciendo la cantidad de comprobaciones necesarias.

En resumen: haz tu vida más fácil y usa variables de entorno para configurar tu aplicación, pero escóndelas creando objetos de configuración.

TAGS: Labs, Objetos de configuración, Variables, Variables de entorno

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*