Configuration d'applications en Rust : bibliothèques config et dotenv

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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 = 10


Les 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=20


Scé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

Recommendations