Configuration des applications Rust : bibliothèques config, envy et dotenvy
Lors du développement d'applications en Rust, la gestion de la configuration est l'une des tâches clés. La flexibilité, la sécurité et la facilité de déploiement dépendent de la bonne approche de chargement des paramètres. Dans l'écosystème Rust, il existe plusieurs solutions matures qui permettent de lire la configuration à partir de fichiers, de variables d'environnement et d'autres sources. Dans cet article, nous examinerons trois outils populaires : config, envy et dotenvy.
1. Bibliothèque config — gestionnaire de configuration universel
config est une bibliothèque puissante pour charger des configurations hiérarchiques. Elle prend en charge plusieurs formats (JSON, TOML, YAML, HJSON, INI), ainsi que les variables d'environnement et les sources distantes. L'idée principale est de combiner toutes les sources en une seule arborescence de paramètres.
Installation
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }Exemple d'utilisation
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")) // Paramètres de base .add_source(File::with_name("config/local").required(false)) // Surcharges locales .add_source(Environment::with_prefix("APP")) // Variables d'environnement avec préfixe APP_ .build()?;
cfg.try_deserialize()}
fn main() { match load_config() { Ok(config) => println!("Configuration chargée : {:?}", config), Err(e) => eprintln!("Erreur de configuration : {}", e), }}La bibliothèque fusionne automatiquement les sources : les valeurs des sources suivantes écrasent les précédentes. Cela permet d'organiser facilement une hiérarchie : default → environment → local override.
2. Bibliothèque envy — configuration à partir de variables d'environnement
envy est une bibliothèque minimaliste qui charge la configuration exclusivement à partir de variables d'environnement. Idéale pour les applications 12-factor, où les paramètres doivent être séparés du code.
Installation
[dependencies]envy = "0.4"serde = { version = "1.0", features = ["derive"] }Exemple d'utilisation
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!("Configuration env : {:?}", config), Err(e) => eprintln!("Erreur Envy : {}", e), }}Pour l'utiliser, il suffit de définir les variables d'environnement :
export SERVER_HOST=127.0.0.1export SERVER_PORT=8080export DATABASE_URL=postgres://user:pass@localhost/dbenvy prend en charge les structures imbriquées via des séparateurs (par exemple, DATABASE__HOST), ainsi que les champs optionnels avec une valeur par défaut.
3. Bibliothèque dotenvy — chargement de fichiers .env
dotenvy est un fork de la bibliothèque populaire dotenv, conçu pour charger les variables d'environnement à partir de fichiers .env. Particulièrement utile en développement, lorsqu'il faut définir rapidement des paramètres locaux.
Installation
[dependencies]dotenvy = "0.15"<