用于管理Rust配置的config库
在开发Rust应用程序时,灵活管理设置是一项重要任务。config库(crate config)提供了一种强大且便捷的方式来处理配置文件、环境变量和内嵌值。它支持TOML、JSON、YAML、HJSON、INI等格式,并允许按优先级合并来自多个源的设置。
安装
在Cargo.toml中添加依赖:
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }基本用法
创建一个简单的配置文件Settings.toml:
[server]host = "127.0.0.1"port = 8080
[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10现在将其加载到Rust应用程序中:
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!("服务器: {}:{}", app_config.server.host, app_config.server.port); println!("数据库: {}", app_config.database.url); Ok(())}支持多种格式
库会根据文件扩展名自动检测格式。JSON示例:
let settings = Config::builder() .add_source(File::with_name("config.json")) .add_source(File::with_name("override.yaml").required(false)) .build()?;环境变量
使用环境变量的前缀,无需修改文件即可覆盖设置:
// 运行: APP_SERVER__PORT=9090 cargo runlet settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP").separator("__")) .build()?;嵌套设置和数组
支持分层结构:
#[derive(Debug, Deserialize)]struct AppConfig { features: Vec<String>, logging: LoggingConfig,}
#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}包含数组的TOML示例:
features = ["auth", "caching", "metrics"]
[logging]level = "info"file = "/var/log/app.log"合并配置
库允许叠加来自不同源的设置。后添加的源具有更高的优先级:
let settings = Config::builder() .add_source(File::with_name("default")) // 基础设置 .add_source(File::with_name("production").required(false)) // 生产环境 .add_source(Environment::with_prefix("APP")) // 环境变量 .build()?;错误处理和默认值
使用get()获取单个值并设置回退值:
let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);动态访问设置
如果配置结构未知,可以使用动态访问:
let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout")