Konfiguration von Rust-Anwendungen: Die Bibliothek `config` für flexible Einstellungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bibliothek config zur Konfigurationsverwaltung in Rust



Bei der Entwicklung von Anwendungen in Rust ist die flexible Verwaltung von Einstellungen eine wichtige Aufgabe. Die Bibliothek config (Crate config) bietet eine leistungsstarke und bequeme Möglichkeit, mit Konfigurationsdateien, Umgebungsvariablen und eingebetteten Werten zu arbeiten. Sie unterstützt die Formate TOML, JSON, YAML, HJSON, INI und ermöglicht das Zusammenführen von Einstellungen aus mehreren Quellen mit Prioritäten.



Installation

Fügen Sie die Abhängigkeit in Cargo.toml hinzu:

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


Grundlegende Verwendung

Erstellen wir eine einfache Konfigurationsdatei Settings.toml:

[server]host = "127.0.0.1"port = 8080

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


Jetzt laden wir sie in die Rust-Anwendung:

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!("Server: {}:{}", app_config.server.host, app_config.server.port); println!("Datenbank: {}", app_config.database.url); Ok(())}


Unterstützung mehrerer Formate

Die Bibliothek erkennt das Format automatisch an der Dateierweiterung. Beispiel mit JSON:

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


Umgebungsvariablen

Verwenden Sie ein Präfix für Umgebungsvariablen, um Einstellungen ohne Dateiänderungen zu überschreiben:

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


Verschachtelte Einstellungen und Arrays

Hierarchische Strukturen werden unterstützt:

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

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


Beispiel für TOML mit Arrays:

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

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


Zusammenführen von Konfigurationen

Die Bibliothek ermöglicht das Überlagern von Einstellungen aus verschiedenen Quellen. Spätere Quellen haben eine höhere Priorität:

let settings = Config::builder()    .add_source(File::with_name("default"))      // Basiseinstellungen    .add_source(File::with_name("production").required(false)) // Produktion    .add_source(Environment::with_prefix("APP")) // Umgebungsvariablen    .build()?;


Fehlerbehandlung und Standardwerte

Verwenden Sie get(), um einzelne Werte mit Fallback abzurufen:

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


Dynamischer Zugriff auf Einstellungen

Wenn die Konfigurationsstruktur nicht im Voraus bekannt ist, verwenden Sie den dynamischen Zugriff:

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

Empfehlungen