Rusty Full Stack

El blog para los amantes de Rust, Ionic y Vuejs

Jaime Blandón
Jaime Blandón Desarrollador de software desde 2009, entusiasta de Rust, Vuejs y Ionic!. Fundador de este blog, espero que las publicaciones te sean de utilidad y si tienes comentarios para mejorar, son bienvenidos.

Variables de Entorno y Archivos Env con Rust - Parte 2

En el artículo anterior hemos visto como poder leer variables de entorno con Rust y para qué podrían ser de utilidad, sin embargo, también hablamos un poco de las limitantes desde la perspectiva de un desarrollador de software relacionadas con la configuración de las variables de entorno para múltiples proyectos.

En este artículo, vamos a intentar resolver estas limitantes (que si aún no las has leído, te invito a hacerlo 😜) utilizando archivos dotenv o .env

¿Qué son los archivos dotenv y para qué sirven?

A lo mejor si vienes de un background en nodejs/javascript, ya te habrás cruzado en alguna ocasión con estos archivos. Un archivo .env o dotenv, es un archivo en formato LLAVE=<valor> (exactamente como se representa una variable de entorno 🤩). Un ejemplo del contenido de un archivo .env es:

        
        
            # Ejemplo de .env

VALOR_A_SUMAR=2
API_KEY=abcdefg12345
RUTA_ARCHIVOS=/mis/archivos/
        
        
    

Este tipo de archivos nos ayudan a resolver el problema de estar teniendo que volver a configurar los valores de las variables de entorno, porque sirven para poder encapsular variables dentro de un ambiente de desarrollo, es decir, que pueden actuar como variables de entorno para nuestro proyecto, sin necesidad de estar configurando una y otra vez si nos pasamos a trabajar a otro proyecto ya que el archivo .env ya estaría configurado.

Ahora bien, es importante también mencionar que los archivos .env NO DEBEN REEMPLAZAR a las variables de entorno en ambientes de producción (a menos que sea estrictamente necesario, por ejemplo al no utilizar docker u otro tipo de contenedores) sino que más bien son herramientas para nosotros los programadores para ahorrar tiempo, y también conocer cómo se debe configurar un programa para los demás miembros del equipo de desarrollo.

Ya que en el archivo .env debemos especificar cuáles variables de entorno son necesarias para que el programa funcione correctamente, será fácil de comprender los parámetros de configuración del programa aún (claro, nunca debes olvidar hacer una buena documentación para que sea aún más fácil de entender 🤓)

¿Cómo utilizar un archivo dotenv con Rust?

Encuentra todos los códigos de este artículo y el artículo anterior en el repositorio en github dando click acá.

Existe un crate bastante útil llamado dotenv el cual nos facilitará la lectura del archivo dotenv y a su vez obtener los valores como si se tratasen de variables de entorno. Vamos a hacer un ejemplo, en la carpeta de tu preferencia crea un nuevo proyecto utilizando el siguiente comando:

cargo new ejemplo_dotenv

cd ejemplo_dotenv

Ahora vamos a incorporar el crate dotenv en nuestro archivo Cargo.toml en la sección de "dependencies"

        
        
            // Cargo.toml

[package]
name = "ejemplo_dotenv"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
dotenv = "0.15.0"

        
        
    

Ahora vamos a crear un archivo al que vamos a llamar ".env" (observa que lleva un punto al inicio del nombre) en el root de nuestro proyecto, debe quedarte de esta forma al mismo nivel del archivo Cargo.toml.

Nuestro programa únicamente leerá e imprimirá en la consola el valor de dos variables de entorno USUARIO y TOKEN , los nombres son bastante genéricos para mostrarte que puedes llegar a tener muchos programas que dependan de esas variables de entorno pero tener valores diferentes.

Ahora vamos a especificar nuestras variables de entorno dentro del .env, recuerda que debe llevar formato LLAVE=<valor>, tu archivo .env debe verse asi:

        
        
            # .env

USUARIO=rustyfullstack
TOKEN=mi-token-super-secreto

        
        
    

Ahora vamos a escribir nuestro programa en el archivo src/main.rs, coloquemos el siguiente código:

        
        
            // src/main.rs

use dotenv::dotenv;
use std::env;

fn main() {
    // Leyendo el dotenv, si el archivo
    // .env existe, entonces lo utilizara como
    // variables de entorno, si no existe,
    // entonces intentara obtener las variables de entorno
    // desde el sistema operativo directamente
    dotenv().ok();

    // Ahora podemos leer las variables que se establecieron en el archivo .env como si fueran
    // variables de entorno, recuerda que si no fueron definidos en un .env, entonces intentara
    // obtener los valores de las variables de entorno en el Sistema Operativo.
    let usuario: String = env::var("USUARIO").expect("No se encuentra la variable de entorno USUARIO");
    let token: String = env::var("TOKEN").expect("No se encuentra la variable de entorno TOKEN");

    println!("Valor de la variable de entorno USUARIO = {}", usuario);
    println!("Valor de la variable de entorno TOKEN = {}", token);
}

        
        
    

En la primera línea, importamos el crate dotenv que nos permitirá leer el archivo .env

use dotenv::dotenv;

En la siguiente línea hacemos uso del crate std::env el cual, como vimos en el artículo anterior, sirve para leer variables de entorno de nuestro sistema operativo, es importante destacar que el crate dotenv a parte de leer el archivo con las variables de entorno, también ayuda al crate std::env para que pueda localizar los valores como si fuera una variable de entorno configurada en nuestro sistema operativo.

use std::env;

dentro de la función main, verás que se ejecuta al principio de nuestro programa la siguiente línea:

dotenv().ok();

La línea anterior es la responsable de buscar el archivo .env y configurar para que std::env pueda detectar la configuración como variables de entorno.

Una nota bastante importante, es que si el archivo .env NO EXISTE, entonces, el programa intenta buscar las variables en el sistema operativo; únicamente si no existe el archivo .env y tampoco se ha configurado la variable de entorno entonces el programa fallará.

Ejecutemos nuestro programa con:

cargo run

Si todo ha salido bien, deberías de ver que el programa imprime en pantalla la siguiente información en la cual, al final, verás los valores que definimos en el archivo .env:

Ya con esto podemos decir que hemos aprendido a leer variables de entorno con el archivo .env 🥳

Sin embargo antes de finalizar hagamos un pequeño experimento 🥸

Como mencioné en párrafos anteriores, si no se encuentra una variable en el dotenv  file, entonces intenta buscar el valor de la variable de entorno en el sistema operativo.

Prueba ahora comentar las variables de entorno (o borrar) el archivo .env, para comentar en un archivo .env, se utiliza el caracter #

        
        
            # .env

# USUARIO=rustyfullstack
# TOKEN=mi-token-super-secreto

        
        
    

Si ahora ejecutamos el programa con "cargo run" vamos a observar que ahora muestra el error porque no encuentra las variables de entorno:

Ahora, sin modificar el programa, configura las variables de entorno USUARIO y TOKEN, pero en nuestro sistema operativo, si estás en windows, lo puedes hacer desde el gestor de variables de entorno, si estás en linux o mac, puedes ejecutar los siguientes comandos:

export USUARIO=jaime

export TOKEN=mi-token

si ahora ejecutamos nuestro programa con "cargo run", vamos a ver que aunque no hemos realizado ningún cambio a nuestro programa, logra imprimir en consola los valores que hemos definido en nuestro sistema operativo.

En un ambiente de producción, lo ideal sería que obtenga las variables de entorno directamente desde el sistema operativo y no desde el .env, sin embargo, si estás instalando tu programa en algún servidor compartido o no utilizas contenedores, entonces los .env puedan ayudarte a evitar provocar errores.

También algo importante a mencionar es que cuando subas tu código a un repositorio como github, gitlab, etc. NO SUBAS el archivo .env, porque podrías exponer datos sensibles como un token de seguridad, generalmente lo que se suele hacer es crear un archivo copia al cual puedes llamar .env-public o .env-dev que únicamente servirá para tener un esqueleto o especificar las variables de entorno que se necesitan, voy a dejar en el repositorio de github un ejemplo de como hacerlo, pero también subiré el archivo .env solo por propósitos de aprendizaje, pero nuevamente, te recomiendo no subirlo a tus repositorios.

Puedes encontrar todos los códigos de este artículo y el artículo anterior en el repositorio en github dando click acá.

Si este artículo te ha sido de utilidad, compártelo con tus amigos y en tus redes sociales 😊

Deja en los comentarios los temas que te gustaría aprendamos juntos sobre Rust y no olvides seguirme en twitter

println!("Hasta la próxima!");


 Utilizamos cookies propias y de terceros para mejorar tu experiencia, mostrar publicidad y análisis de navegación, puedes encontrar el detalle en nuestra Política de Cookies