Configuração de aplicações Rust: bibliotecas config, envy e dotenvy
No desenvolvimento de aplicações em Rust, o gerenciamento de configuração é uma das tarefas principais. A flexibilidade, segurança e facilidade de implantação dependem de uma abordagem correta para carregar as definições. No ecossistema Rust, existem várias soluções maduras que permitem ler configurações de arquivos, variáveis de ambiente e outras fontes. Neste artigo, vamos explorar três ferramentas populares: config, envy e dotenvy.
1. Biblioteca config — gerenciador de configuração universal
config é uma biblioteca poderosa para carregar configurações hierárquicas. Ela suporta vários formatos (JSON, TOML, YAML, HJSON, INI), além de variáveis de ambiente e fontes remotas. A ideia principal é combinar todas as fontes em uma única árvore de definições.
Instalação
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }Exemplo de uso
use config::{Config, File, Environment};use serde::Deserialize;
#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}
#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16,}
#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}
fn load_config() -> Result<AppConfig, config::ConfigError> { let cfg = Config::builder() .add_source(File::with_name("config/default")) // Definições base .add_source(File::with_name("config/local").required(false)) // Sobrescritas locais .add_source(Environment::with_prefix("APP")) // Variáveis de ambiente com prefixo APP_ .build()?;
cfg.try_deserialize()}
fn main() { match load_config() { Ok(config) => println!("Configuração carregada: {:?}", config), Err(e) => eprintln!("Erro de configuração: {}", e), }}A biblioteca combina automaticamente as fontes: valores de fontes posteriores sobrescrevem os anteriores. Isso permite organizar facilmente uma hierarquia: default → environment → local override.
2. Biblioteca envy — configuração a partir de variáveis de ambiente
envy é uma biblioteca minimalista que carrega configurações exclusivamente de variáveis de ambiente. Ideal para aplicações 12-factor, onde as definições devem ser separadas do código.
Instalação
[dependencies]envy = "0.4"serde = { version = "1.0", features = ["derive"] }Exemplo de uso
use serde::Deserialize;
#[derive(Debug, Deserialize)]struct AppConfig { #[serde(rename = "SERVER_HOST")] host: String, #[serde(rename = "SERVER_PORT")] port: u16, #[serde(rename = "DATABASE_URL")] db_url: String,}
fn load_config() -> Result<AppConfig, envy::Error> { envy::from_env::<AppConfig>()}
fn main() { match load_config() { Ok(config) => println!("Configuração de env: {:?}", config), Err(e) => eprintln!("Erro no envy: {}", e), }}Para funcionar, basta definir as variáveis de ambiente:
export SERVER_HOST=127.0.0.1export SERVER_PORT=8080export DATABASE_URL=postgres://user:pass@localhost/dbenvy suporta estruturas aninhadas através de separadores (por exemplo, DATABASE__HOST), além de campos opcionais com valor padrão.
3. Biblioteca dotenvy — carregamento de arquivos .env
dotenvy é um fork da popular biblioteca dotenv, projetado para carregar variáveis de ambiente a partir de arquivos .env. Particularmente útil durante o desenvolvimento, quando é necessário definir rapidamente definições locais.
Instalação
[dependencies]dotenvy = "0.15"< Também na biblioteca
Rate Limiting em Kotlin: bibliotecas e implementação
Cliente Elasticsearch para Node.js: @elastic/elasticsearch
Geração de PDF em C# (.NET): Guia Completo de Bibliotecas