Configuration d'applications Rust : bibliothèques config et dotenv
Toute application moderne nécessite un système de configuration flexible : paramètres de base de données, clés API, ports serveur, niveaux de journalisation et autres paramètres. Dans l'écosystème Rust, il existe des outils puissants pour cela — les crates config et dotenv. Ils permettent de combiner les paramètres provenant de différentes sources (fichiers, variables d'environnement, arguments de ligne de commande) en une seule structure typée et sécurisée.
Pourquoi une bibliothèque dédiée ?
Rust est un langage à typage statique fort. La simple lecture de chaînes depuis std::env::var() entraîne de nombreuses vérifications et conversions manuelles. La bibliothèque config automatise ce processus :
- Prise en charge des formats : YAML, JSON, TOML, HJSON, INI, RON
- Structure hiérarchique des paramètres avec possibilité de redéfinition
- Désérialisation automatique dans des structures personnalisées via
serde - Combinaison de plusieurs sources avec priorités (fichier < env < CLI)
Installation
Ajoutez dans Cargo.toml :
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }dotenv = "0.15"Exemple de base : lecture depuis un fichier et env
Créons une structure pour la configuration de l'application :
use serde::Deserialize;use config::Config;
#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}
#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16, workers: u8,}
#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}
fn main() -> Result<(), config::ConfigError> { // Chargement de la configuration let config = Config::builder() .add_source(config::File::with_name("config/default")) .add_source(config::Environment::with_prefix("APP")) .build()?;
let app_config: AppConfig = config.try_deserialize()?; println!("{:#?}", app_config); Ok(())}Fichier config/default.toml :
[server]host = "127.0.0.1"port = 8080workers = 4
[database]url = "postgres://localhost/mydb"pool_size = 10Les variables d'environnement avec le préfixe APP_ redéfinissent les valeurs du fichier. Par exemple, APP_DATABASE__URL modifiera l'URL de la base de données.
Travail avec dotenv
Pour faciliter le développement, on utilise souvent un fichier .env. Le crate dotenv le charge dans les variables d'environnement avant l'initialisation de config :
use dotenv::dotenv;
fn main() { dotenv().ok(); // chargement du .env // ensuite initialisation de config comme dans l'exemple ci-dessus}Contenu du .env :
APP_SERVER__PORT=3000APP_DATABASE__POOL_SIZE=20Scénario avancé : plusieurs sources
Les projets réels nécessitent de combiner des paramètres provenant de différents endroits. config permet de définir une chaîne de sources avec priorité :
let config = Config::builder() // Paramètres de base (faible priorité) .add_source(config::File::with_name("config/default")) // Redéfinition pour un environnement spécifique .add_source(config::File::with_name(&format!("config/{}", env::var("APP_ENV").unwrap_or("development")))) // Variables d'environnement (priorité moyenne) .add_source(config::Environment::with_prefix("APP")) // Arguments de ligne de commande (haute priorité) .add_source(config::File::from(std::env::args().nth(1).unwrap_or_default())) .build()?;Best Practices
- Utilisez des préfixes pour les variables d'environnement, afin d'éviter les conflits avec les variables système
Aussi dans la bibliothèque
Spring Data JPA Java : guide complet avec exemples concrets
Files d'attente de tâches pour Swift : guide complet sur GCD et Operation Queues
Travail avec les images en PHP : aperçu des bibliothèques et outils
gRPC pour JavaScript (Node.js) : bibliothèques, configuration et exemples de code