Ruby

Leer variables del entorno (archivo .env) con Ruby y dotenv

Hoy veremos cómo usar la gema de Ruby llamada dotenv para leer variables del entorno de un archivo o fichero llamado .env. Este archivo ayuda a movernos entre distintos escenarios en donde cambiamos algunas variables que dependen del entorno.

Por ejemplo, en el modo local, tenemos una contraseña y usuario para la base de datos. En nuestro servidor tenemos otra, y así sucesivamente. No sería bueno “hardcodear” o escribir en el código las credenciales de acceso, pues sería peligroso si compartimos el código, o si lo ponemos en un repositorio, etcétera.

Usar env en Ruby para leer variables del entorno

Además, cada programador tiene distintas credenciales. Así que los archivos .env son usados para gestionar credenciales o claves de acceso que cambian en cada entorno.

Requisitos

Simplemente instala Ruby y prueba que el gestor de gemas funcione.

La gema dotenv

Esta gema está en este repositorio, si puedes, dale una estrella.

Ejemplo de archivo .env para leer en Ruby

Un archivo .env es algo así como el que leímos con PHP anteriormente, guarda claves y valores. Aquí está el que usaremos para exponer cómo leer variables del entorno con Ruby:

# Ejemplo de archivo .env para
# su lectura. Visita parzibyte.me/blog
USUARIO_MYSQL="parzibyte"
PASS_MYSQL="hunter2"
CLAVE_API_FIREBASE="123" # Aquí podría ir un comentario
# Podemos tener variables con múltiples líneas
CLAVE_RSA_PUBLICA="-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----"
# De hecho, las comillas no son obligatorias (sólo para cadenas con varias líneas),
# pero las recomiendo
HOST_MYSQL=12.34.56.78

# Los números son leídos como cadena pero podemos usar to_i o to_f
PI=3.1416

Por cierto, se les dice .env pero lo cierto es que pueden tener cualquier nombre y extensión. Podría ser incluso un .txt o uno sin extensión.

Asimismo, hay algunos que se llaman .env.example (o .env.ejemplo para los que hablamos español) que sí se comparten (es decir, se dejan en el código y se suben al control de versiones si hay uno) para que los demás programadores hagan una copia, la renombren y la llenen con sus credenciales.

Leer archivo env con Ruby

Ahora que ya expusimos el archivo env, veamos cómo es un ejemplo de su lectura:

=begin
    Leer variables del entorno de un archivo
    .env (cuyo nombre no es obligatoriamente ese)
    usando Ruby y la gema dotenv

    @author parzibyte
=end

# Cargamos la gema
require 'dotenv'

# Y cargamos el archivo que tiene las variables
# También es válido Dotenv.load('.env', 'otro_archivo.txt', ...)
Dotenv.load('.env')

# Nos aseguramos de que las claves estén presentes, así
# no tenemos errores más tarde en tiempo de ejecución; lo
# detenemos aquí
#Nota: no soportado todavía (31/12/2018 pero en el repositorio dicen que lo agregarán)
#Dotenv.require_keys("USUARIO_MYSQL", "CLAVE_RSA_PUBLICA")

# Hora de leer una variable
usuario_mysql = ENV['USUARIO_MYSQL']
puts "El usuario de MySQL es: '#{usuario_mysql}'"

host_mysql = ENV['HOST_MYSQL']
puts "El host de MySQL es: '#{host_mysql}'"

clave_rsa = ENV['CLAVE_RSA_PUBLICA']
puts "La clave RSA: '#{clave_rsa}'"

pi = ENV['PI'].to_f
puts "pi * pi = #{pi * pi}"

# Si no existe, devuelve nil
variable_inexistente = ENV['INEXISTENTE']
if variable_inexistente === nil
    puts "Al leer, ¡es nil!"
end

Cargamos el archivo con Dotenv.load; esta función acepta varias rutas de archivos, por lo que podemos tener varios archivos de entorno.

Para leer una variable se usa ENV["nombre"] y en caso de que la variable no exista, se devuelve nil.

Todo lo que devuelve env es una cadena, pero podemos convertirlo con to_i, to_f u otros métodos dependiendo del uso que les vayamos a dar.

Nota: se supone que hay un método llamado require_keys que verifica que todas las claves existan (para evitar errores en tiempo de ejecución) pero no funcionaba al momento de escribir el post, aunque en el repositorio oficial dijeron que se agregaría en un futuro, por eso es que dejé la línea comentada.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.