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/dbenvy 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"< También en la biblioteca
Criptografía en Node.js: cifrado y hash con crypto
Generación de PDF en Swift (iOS/macOS): resumen de herramientas y ejemplos
Trabajo con YAML en Swift (iOS/macOS) — bibliotecas Yams y YamlSwift