Configuration des applications Rust : la bibliothèque `config` pour une configuration flexible

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

La bibliothèque config pour la gestion de configuration en Rust



Lors du développement d'applications en Rust, la gestion flexible des paramètres est une tâche importante. La bibliothèque config (crate config) offre un moyen puissant et pratique de travailler avec des fichiers de configuration, des variables d'environnement et des valeurs intégrées. Elle prend en charge les formats TOML, JSON, YAML, HJSON, INI et permet de fusionner les paramètres de plusieurs sources avec des priorités.



Installation

Ajoutez la dépendance dans Cargo.toml :

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


Utilisation de base

Créons un simple fichier de configuration Settings.toml :

[server]host = "127.0.0.1"port = 8080

[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10


Chargeons-le maintenant dans une application Rust :

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

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

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

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

fn main() -> Result<(), config::ConfigError> { let settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP")) .build()?;

let app_config: AppConfig = settings.try_deserialize()?; println!("Serveur : {}:{}", app_config.server.host, app_config.server.port); println!("Base de données : {}", app_config.database.url); Ok(())}


Prise en charge de plusieurs formats

La bibliothèque détecte automatiquement le format par l'extension du fichier. Exemple avec JSON :

let settings = Config::builder()    .add_source(File::with_name("config.json"))    .add_source(File::with_name("override.yaml").required(false))    .build()?;


Variables d'environnement

Utilisez un préfixe pour les variables d'environnement afin de surcharger les paramètres sans modifier les fichiers :

// Exécution : APP_SERVER__PORT=9090 cargo runlet settings = Config::builder()    .add_source(File::with_name("Settings"))    .add_source(Environment::with_prefix("APP").separator("__"))    .build()?;


Paramètres imbriqués et tableaux

Les structures hiérarchiques sont prises en charge :

#[derive(Debug, Deserialize)]struct AppConfig {    features: Vec<String>,    logging: LoggingConfig,}

#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}


Exemple TOML avec des tableaux :

features = ["auth", "caching", "metrics"]

[logging]level = "info"file = "/var/log/app.log"


Fusion de configurations

La bibliothèque permet de superposer les paramètres de différentes sources. Les sources ultérieures ont une priorité plus élevée :

let settings = Config::builder()    .add_source(File::with_name("default"))      // paramètres de base    .add_source(File::with_name("production").required(false)) // production    .add_source(Environment::with_prefix("APP")) // variables d'environnement    .build()?;


Gestion des erreurs et valeurs par défaut

Utilisez get() pour obtenir des valeurs individuelles avec une valeur de repli :

let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);


Accès dynamique aux paramètres

Si la structure de configuration est inconnue à l'avance, utilisez l'accès dynamique :

let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout")                    

Recommendations