dotenv, las variables de entorno en un archivo

Si ayer os hablaba de cómo gestiono las configuraciones de un proyecto node siguiendo la recomendación de The Twelve-Factor App, hoy vengo a contaros cómo evito sobrecargar mi entorno de desarrollo con variables que solamente necesito cuando estoy desarrollando un proyecto.

Una primera idea: scripts

En una primera aproximación, mi idea era crear un script que establecía las variables de entorno y otro que las eliminaba. Esta opción es útil, aunque tiene algunos inconvenientes:

  • Siempre hay que recordar lanzar el script ANTES de comenzar el desarrollo y también DESPUÉS para eliminar las variables
  • El script es dependiente del sistema operativo. Teniendo en cuenta que lo mismo desarrollo en Unix que en Windows, esto me obligaba a mantener en total cuatro scripts.

Con el uso de npm la cosa puede ser más fácil, ya que se pueden integrar en el comando run o start y resolvemos parte del problema.

Después se me ocurrió ¿y si existiera un gestor de entornos virtuales como los usados en Python? Pues bien, intentando resolver esa pregunta apareció:

Una solución inesperada

Y vino en forma de paquete sin dependencias que podía instalar fácilmente utilizando npm y que se llama dotenv. Aquí tienes el repositorio en GitHub por si tienes curiosidad (que sé que la tienes ;)

https://github.com/motdotla/dotenv

Básicamente este paquete nos permite crear un archivo .env en nuestro proyecto que cargará en process.env como nuestras variables de entorno. Chulo ¿eh?

La forma de uso sería la siguiente:

Primero instalamos el paquete con

npm install dotenv

desde la versión 3 ya no es necesario utilizar --save para guardar la dependencia en el archivo package.json

A continuación creamos un archivo .env con las variables de entorno que queremos utilizar en el directorio raíz de nuestro proyecto. Por ejemplo, siguiendo con el ejemplo de ayer, podría tener el siguiente contenido:

DB_HOST=127.0.0.1
DB_PORT=27017
DB_USER=mi_usuario
DB_PASSWD=mi_password
DB_NAME=mi_base_de_datos
NODE_ENV=debug
LOG_LEVEL=info
LOG_ENABLED=true
AMQP_URL=https://mi.servidor.rabbitmq

En el archivo principal de nuestra aplicación, tan al inicio como sea posible debemos cargar la dependencia y ejecutar el método config():

require('dotenv').config()

Y tras esta línea ya tendremos disponibles nuestras variables de entorno.

Los valores de dichas variables serán leídos como cadenas, por lo que pueden necesitar de conversión al tipo adecuado antes de su utilización.

Conclusión

La gestión de variables de entorno como configuración es, sin lugar a dudas, una muy buena práctica y dotenv está aquí para ayudarnos. En el caso de variables de entorno que no sean sensibles (ni tokens, ni contraseñas…) podemos incluirlo directamente en el repositorio o, al menos, crear un archivo env.sample que nos ayude con los valores de configuración.

A partir de ahí, basta con mantener un archivo .env para cada uno de los entornos donde nuestra aplicación deba funcionar: desarrollo, pruebas, producción…

Stay tuned and happy coding!

Escrito el 11 de enero de 2018 |