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

En este artículo, vamos a ver algunos ejemplos para el manejo de las variables de entorno utilizando Rust, también vamos a crear nuestros propios archivos .env los cuales son archivos bastante útiles en el desarrollo de aplicaciones dinámicas. Empecemos con un par de preguntas.

¿Qué son las variables y entorno y para qué se utilizan?

Las variables de entorno son una forma de almacenar información en nuestro sistema operativo, generalmente son utilizadas cuando queremos hacer que ya sea nuestro sistema o algún programa se comporte de una u otra forma.

Las variables de entorno en el ámbito del desarrollo de software son utilizadas muchas veces para que la configuración de nuestros programas sean más dinámicas, es decir, que podamos determinar a través de valores su comportamiento sin necesidad de modificar el código del programa.

Supongamos que tenemos un programa que se necesita conectar con alguna base de datos o con algún API y que a lo mejor los datos de conexión no serán entre distintos ambientes como el de pruebas y producción, podemos los valores de la conexión (hazlo de forma segura 👮‍♀️) y de esta forma no tener que crear una versión de nuestro programa para cada ambiente.

Miremos este ejemplo ficticio, no necesitas copiar el código. Supongamos que hacemos una función que calcula una suma, donde uno de los sumandos es un valor constante, por ejemplo el 2.

        
        
            // Ejemplo

fn suma(a: usize) -> usize {
  a + 2
}
        
        
    

La función anterior devolvería el valor de "a" más el número 2, pero ahora supongamos que comenzamos a recibir solicitudes de cambiar ese 2 por un 3, y luego por un 4, etc.

Cada vez que cambiemos el valor del número a sumar debemos cambiar nuestro código, volverlo a probar y compilar, lo cual puede llevar bastante tiempo, para escenarios donde hay valores que pueden estar cambiando o que pueden ser diferentes entre ambientes es que las variables de entorno pueden facilitarlos la vida.

por ejemplo el programa anterior podría tener el siguiente pseudo código (no lo intentes compilar)

        
        
            // Ejemplo con variables de entorno

fn suma(a: usize) -> usize {
   a + VALOR_A_SUMAN
}
        
        
    

si vemos se ha reemplazado el "2" por VALOR_A_SUMAR, este último, puede ser una variable de entorno, por lo que si nos solicitan cambiar el "2", en lugar de modificar nuestro código fuente, solamente necesitaremos modificar el VALOR_A_SUMAR, sin necesidad de compilar nada, nuestro programa funcionaria de forma esperada.

¿Qué tal si hacemos bien el código con Rust 😉? Para hacerlo bien, debemos primero configurar nuestra variable de entorno VALOR_A_SUMAR.

Configurar Variables de Entorno.

Las variables de entorno dependen de tu sistema operativo (Windows, Linux, MacOS, etc), como no conozco tu SO, dejare por acá unos enlaces a la configuración de variables de entorno en Windows, Linux y Mac.

Si estas utilizando linux o mac, una forma fácil de configurar una variable de entorno es escribiendo el siguiente comando en una terminal.

export VALOR_A_SUMAR=2

Como puedes ver, independientemente del SO que tengas, las variables de entorno siempre serán del tipo LLAVE=<valor> por lo que al momento de leerlas, podemos utilizar la LLAVE.

Leyendo Variables de Entorno con Rust.

Ahora vamos a crear nuestro programa con el mismo ejemplo anterior donde tenemos una función que debe sumar un valor que le pasemos a nuestra función con un valor a sumar en nuestras variables de entorno.

Crea una carpeta llamada leer_variable donde te sea más conveniente, dentro de la carpeta crea un archivo main.rs y colocamos el siguiente código:

        
        
            // main.rs

use std::env;

fn sumar(a: usize) -> Result<usize, env::VarError> {
    // Leyendo la variable de entorno, en caso no se haya creado el programa terminara con error mostrando el mensaje del expect
    let valor_a_sumar = env::var("VALOR_A_SUMAR").expect("Falta Definir la Variable de Entorno VALOR_A_SUMAR");

    // Por defecto, las variables de entorno se leen como String, por lo que para la funcion hay que hacer el cast explicito a usize
    Ok(a + valor_a_sumar.parse::<usize>().unwrap())
}

fn main() {
    // Por facilidad, no se valida el input. Recomendable hacerlo para produccion
    let resultado: usize = sumar(1).unwrap();
    println!("resultado suma = {}", resultado);
}

        
        
    

Como puedes ver en el código anterior, Rust ya tiene los crates necesarios para manejar variables de entorno dentro del crate std::env.

La línea:

        
        
            
fn sumar(a: usize) -> Result<usize, env::VarError>
        
        
    

indica que la función sumar devolverá un número de tipo usize o un error "VarError" si la variable de entorno no ha sido definida.

Si compilamos nuestro programa con el comando.

rustc main.rs

Y luego, si lo ejecutamos SIN haber configurado la variable de entorno VALOR_A_SUMAR, veremos que nuestro programa falla con el mensaje "Falta Definir la Variable de Entorno VALOR_A_SUMAR"

Pero si configuramos nuestra variable de entorno de forma correcta con el valor 2 y ejecutamos:

./main

Veremos que ahora el programa termina de forma exitosa con el valor de la suma como "3" (1 + 2)

resultado suma = 3

Ahora prueba cambiar VALOR_A_SUMAR colocándole un "3" como valor, si ejecutas el programa nuevamente, sin compilarlo de nuevo, verás que ahora imprime en pantalla:

resultado sumar = 4

La línea:

        
        
            
let valor_a_sumar = env::var("VALOR_A_SUMAR").expect("Falta Definir la Variable de Entorno VALOR_A_SUMAR");
        
        
    

Es la encargada de leer la llave o variable de entorno "VALOR_A_SUMAR" o devolver un error personalizado, puedes cambiar "VALOR_A_SUMAR" por la variable de entorno que quieras leer. Es importando tener en cuenta que todas las variables de entorno Rust las leerá como tipo "String".

Genial! Hemos aprendido a leer variables de entorno con Rust 😎

Algunos Problemas al Programar Utilizando Variables de Entorno.

Algunos problemas cuando programamos utilizando variables de entorno es que las variables de entorno son únicas en tu sistema operativa, es decir, que no puedes tener dos variables de entorno con el mismo nombre. Aunque esto no parezca un problema, al momento de programar puede ser un poco complicado, porque generalmente cuando desplegamos nuestras aplicaciones en un ambiente de producción, generalmente utilizamos contenedores en Docker o servidores que encapsulan o se utilizan solamente para nuestra aplicación, por lo que tener variables de entorno con nombres únicos no suele ser un problema, pero ahora imagina que distintas aplicaciones dentro de tu organización utilicen una variable de entorno de nombre USUARIO_BD. El valor de la variable debe ser único en tu sistema operativo, por lo que te tocaría recordarte cambiarla cada vez que te toque trabajar en una aplicación distinta, de lo contrario a lo mejor no podrías conectarte a la Base de Datos o los resultados de tu aplicación no serían los adecuados en tu entorno de desarrollo.

Otro problema que puedes llegar a tener es que a medida tus aplicaciones vayan siendo más complejas, es muy probable que tu aplicación necesite utilizar más de una variable de entorno, que aunque en tu sistema operativo puedas guardarlos de forma permanente, hacerle saber a tus compañeros de trabajo el listado de variables que necesitarán para correr tu app y su valores, puede ser una tarea muy complicada.

Al escenario anterior, agrega una complicación adicional en la que si tus aplicaciones utilizan variables con nombres iguales, pero valores diferentes, debes reconfigurar tus variables de entorno cada vez que te toque trabajar en aplicaciones distintas.

Parecería que las variables de entorno han complicado nuestro trabajo, pero por suerte, hay una solución bastante buena que se llaman archivos dotenv o archivos .env 🥳

Para no hacer más largo este artículo, vamos a aprender como utilizar archivos dotenv en el siguiente artículo.

Si este artículo te ha sido útil, compártelo con tus amigos y en tus redes sociales. 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