Carregamento em tempo de execucao
English | 中文 | 日本語 | 한국어 | Français | Deutsch | Español | Português | Svenska | Suomi | Nederlands
O carregamento em tempo de execucao e intencionalmente dividido entre Figment e confique:
figment:
runtime file loading
runtime environment loading
runtime source metadata
confique:
schema metadata
defaults
validation
config templates
A API principal e:
#![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>>(())
}
Use load_config_with_figment quando a aplicacao precisar de metadados de
origem:
#![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>>(())
}
Etapas de carregamento
O carregador de alto nivel executa estas etapas:
- Resolve lexicalmente o caminho da configuracao raiz.
- Carrega o primeiro arquivo
.envencontrado ao subir a partir do diretorio da configuracao raiz. - Carrega cada arquivo de configuracao como uma camada parcial para descobrir includes.
- Constroi um grafo Figment a partir dos arquivos de configuracao descobertos.
- Mescla o
ConfiqueEnvProvidercom prioridade maior que arquivos. - Opcionalmente mescla sobrescritas de CLI especificas da aplicacao.
- Extrai uma camada
confiquedo Figment. - Aplica padroes de codigo do
confique. - Valida e constroi o esquema final.
load_config e load_config_with_figment executam as etapas 1-5 e 7-9. A
etapa 6 e especifica da aplicacao porque este crate nao consegue inferir como
uma flag de CLI mapeia para um campo do esquema.
Formatos de arquivo
O provedor de arquivo em tempo de execucao e selecionado pela extensao do caminho de configuracao:
.yamle.ymlusam YAML..tomlusa TOML..jsone.json5usam JSON.- extensoes desconhecidas ou ausentes usam YAML.
A geracao de modelos ainda usa os renderizadores de modelo do confique para
saida YAML, TOML e compativel com JSON5.
Prioridade de includes
O carregador de alto nivel mescla provedores de arquivo para que arquivos incluidos tenham prioridade menor que o arquivo que os incluiu. O arquivo de configuracao raiz tem a maior prioridade entre arquivos.
Variaveis de ambiente tem prioridade maior que todos os arquivos de
configuracao. Padroes do confique sao usados apenas para valores que nao foram
fornecidos por provedores de tempo de execucao.
Quando sobrescritas de CLI sao mescladas depois de build_config_figment, a
precedencia completa e:
command-line overrides
> environment variables
> config files
> confique code defaults
A sintaxe de linha de comando nao e definida por rust-config-tree. Uma flag
como --server-port pode sobrescrever server.port se a aplicacao mapear esse
valor analisado para um provedor serializado aninhado. Uma sintaxe pontuada
--server.port ou a.b.c so existe se a aplicacao a implementar.
Isso significa que a precedencia de CLI se aplica apenas a chaves presentes no provedor de sobrescrita da aplicacao. Use-a para valores operacionais alterados com frequencia em uma unica execucao. Deixe configuracao duravel em arquivos.
#![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>>(())
}