Laden zur Laufzeit
English | 中文 | 日本語 | 한국어 | Français | Deutsch | Español | Português | Svenska | Suomi | Nederlands
Das Laden zur Laufzeit ist bewusst zwischen Figment und confique aufgeteilt:
figment:
runtime file loading
runtime environment loading
runtime source metadata
confique:
schema metadata
defaults
validation
config templates
Die Haupt-API ist:
#![allow(unused)]
fn main() {
use rust_config_tree::load_config;
let config = load_config::<AppConfig>("config.yaml")?;
Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
}
Verwende load_config_with_figment, wenn die Anwendung Quellenmetadaten
braucht:
#![allow(unused)]
fn main() {
use rust_config_tree::load_config_with_figment;
let (config, figment) = load_config_with_figment::<AppConfig>("config.yaml")?;
let _ = (config, figment);
Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
}
Ladeschritte
Der High-Level-Loader fuehrt diese Schritte aus:
- Root-Konfigurationspfad lexikalisch aufloesen.
- Die erste
.env-Datei laden, die beim Aufwaertslaufen ab dem Root-Konfigurationsverzeichnis gefunden wird. - Jede Konfigurationsdatei als Teilschicht laden, um Includes zu entdecken.
- Einen Figment-Graphen aus den entdeckten Konfigurationsdateien bauen.
- Den
ConfiqueEnvProvidermit hoeherer Prioritaet als Dateien zusammenfuehren. - Optional anwendungsspezifische CLI-Ueberschreibungen zusammenfuehren.
- Eine
confique-Schicht aus Figment extrahieren. confique-Code-Defaults anwenden.- Das finale Schema validieren und konstruieren.
load_config und load_config_with_figment fuehren die Schritte 1-5 und 7-9
aus. Schritt 6 ist anwendungsspezifisch, weil diese Crate nicht ableiten kann,
wie ein CLI-Flag auf ein Schemafeld abgebildet wird.
Dateiformate
Der Laufzeit-Dateiprovider wird aus der Erweiterung des Konfigurationspfads gewaehlt:
.yamlund.ymlverwenden YAML..tomlverwendet TOML..jsonund.json5verwenden JSON.- unbekannte oder fehlende Erweiterungen verwenden YAML.
Die Vorlagenerzeugung verwendet weiterhin die Template-Renderer von confique fuer YAML, TOML und JSON5-kompatible Ausgabe.
Include-Prioritaet
Der High-Level-Loader fuehrt Dateiprovider so zusammen, dass inkludierte Dateien niedrigere Prioritaet haben als die Datei, die sie inkludiert. Die Root- Konfigurationsdatei hat die hoechste Dateiprioritaet.
Umgebungsvariablen haben hoehere Prioritaet als alle Konfigurationsdateien.
confique-Defaults werden nur fuer Werte verwendet, die nicht von
Laufzeitprovidern geliefert werden.
Wenn CLI-Ueberschreibungen nach build_config_figment zusammengefuehrt werden,
gilt diese vollstaendige Prioritaet:
command-line overrides
> environment variables
> config files
> confique code defaults
Die Kommandozeilensyntax wird nicht von rust-config-tree definiert. Ein Flag
wie --server-port kann server.port ueberschreiben, wenn die Anwendung den
geparsten Wert in einen verschachtelten serialisierten Provider abbildet. Eine
Syntax mit Punkten wie --server.port oder a.b.c existiert nur, wenn die
Anwendung sie implementiert.
Das bedeutet: CLI-Prioritaet gilt nur fuer Schluessel, die im Ueberschreibungsprovider der Anwendung vorhanden sind. Nutze sie fuer operative Werte, die haeufig fuer einen einzelnen Lauf geaendert werden. Dauerhafte Konfiguration bleibt in Dateien.
#![allow(unused)]
fn main() {
use figment::providers::Serialized;
use serde::Serialize;
use rust_config_tree::{build_config_figment, load_config_from_figment};
#[derive(Debug, Serialize)]
struct CliOverrides {
#[serde(skip_serializing_if = "Option::is_none")]
server: Option<CliServerOverrides>,
}
#[derive(Debug, Serialize)]
struct CliServerOverrides {
#[serde(skip_serializing_if = "Option::is_none")]
port: Option<u16>,
}
let cli_overrides = CliOverrides {
server: Some(CliServerOverrides { port: Some(9000) }),
};
let figment = build_config_figment::<AppConfig>("config.yaml")?
.merge(Serialized::defaults(cli_overrides));
let config = load_config_from_figment::<AppConfig>(&figment)?;
let _ = config;
Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
}