Configuración de aplicaciones Rust: bibliotecas config, envy y dotenvy

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Configuración de aplicaciones Rust: bibliotecas config, envy y dotenvy



Al desarrollar aplicaciones en Rust, la gestión de la configuración es una de las tareas clave. La flexibilidad, seguridad y facilidad de despliegue dependen del enfoque correcto para cargar los ajustes. En el ecosistema de Rust existen varias soluciones maduras que permiten leer la configuración desde archivos, variables de entorno y otras fuentes. En este artículo, analizaremos tres herramientas populares: config, envy y dotenvy.



1. Biblioteca config — gestor de configuración universal



config es una potente biblioteca para cargar configuraciones jerárquicas. Soporta múltiples formatos (JSON, TOML, YAML, HJSON, INI), así como variables de entorno y fuentes remotas. La idea principal es combinar todas las fuentes en un único árbol de ajustes.



Instalación

[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }


Ejemplo de uso

use config::{Config, File, Environment};use serde::Deserialize;

#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}

#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16,}

#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}

fn load_config() -> Result<AppConfig, config::ConfigError> { let cfg = Config::builder() .add_source(File::with_name("config/default")) // Ajustes base .add_source(File::with_name("config/local").required(false)) // Sobrescrituras locales .add_source(Environment::with_prefix("APP")) // Variables de entorno con prefijo APP_ .build()?;

cfg.try_deserialize()}

fn main() { match load_config() { Ok(config) => println!("Configuración cargada: {:?}", config), Err(e) => eprintln!("Error de configuración: {}", e), }}


La biblioteca combina automáticamente las fuentes: los valores de fuentes posteriores sobrescriben a los anteriores. Esto permite organizar fácilmente una jerarquía: default → environment → local override.



2. Biblioteca envy — configuración desde variables de entorno



envy es una biblioteca minimalista que carga la configuración exclusivamente desde variables de entorno. Ideal para aplicaciones de 12 factores, donde los ajustes deben estar separados del código.



Instalación

[dependencies]envy = "0.4"serde = { version = "1.0", features = ["derive"] }


Ejemplo de uso

use serde::Deserialize;

#[derive(Debug, Deserialize)]struct AppConfig { #[serde(rename = "SERVER_HOST")] host: String, #[serde(rename = "SERVER_PORT")] port: u16, #[serde(rename = "DATABASE_URL")] db_url: String,}

fn load_config() -> Result<AppConfig, envy::Error> { envy::from_env::<AppConfig>()}

fn main() { match load_config() { Ok(config) => println!("Configuración de entorno: {:?}", config), Err(e) => eprintln!("Error de envy: {}", e), }}


Para funcionar, solo es necesario establecer las variables de entorno:

export SERVER_HOST=127.0.0.1export SERVER_PORT=8080export DATABASE_URL=postgres://user:pass@localhost/db


envy soporta estructuras anidadas mediante separadores (por ejemplo, DATABASE__HOST), así como campos opcionales con valor por defecto.



3. Biblioteca dotenvy — carga de archivos .env



dotenvy es un fork de la popular biblioteca dotenv, diseñado para cargar variables de entorno desde archivos .env. Es especialmente útil durante el desarrollo, cuando se necesita definir rápidamente ajustes locales.



Instalación

[dependencies]dotenvy = "0.15"<                    

Recommendations