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 = 10Jetzt 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") Auch in der Bibliothek
Geolokalisierung und Karten in C++: Überblick über Bibliotheken und Werkzeuge
PDF-Generierung in PHP: Die besten Bibliotheken und Codebeispiele