1 个不稳定版本
0.1.0 | 2024年4月26日 |
---|
#6 在 #autoconf
被 2 crate 使用
8KB
自动配置
一个简单的 Rust 应用配置宏。
由 Kidan Nelson 用 ❤️ 构建
概述
autoconf
是一个 crate,它通过自动推导功能以从环境变量、配置文件和默认值中加载设置,从而简化 Rust 应用配置的管理。这是通过程序性地解析结构体字段来构建环境变量键以及使用 serde
从提供的配置文件路径进行反序列化来完成的。功能可以通过几个宏属性助手进行自定义。
属性 | 功能 |
---|---|
prefix | 设置环境变量的前缀,可以在结构体或字段级别设置。 |
path | 指定配置文件的路径,可以省略扩展名。 |
key | 覆盖属性的默认键名,忽略前缀和字段名。 |
nest | 对于非标准类型,这些也必须推导出 Config |
skip | 跳过从环境变量加载属性。 |
separator | 设置放置在前缀和字段名之间的分隔符字符,可以在结构体或字段级别设置,默认为 "_" |
主要特性
- 简单性:最少模板代码,只需注释你的结构体以及具有命名字段和单个方法的结构体。
- 灵活性:支持从环境变量、单个
toml
、json
、yaml
、xml
、ini
、ron
或json5
配置文件中加载配置数据,并以默认特质实现作为后备。 - 集成:方便地与其他宏(如
smart_default
)集成。
用法
以下是一个包含所有当前实现属性的完整示例。首先定义一个配置结构体,由 derive 宏从指定来源填充
use autoconf::prelude::*;
use smart_default::SmartDefault;
#[derive(Config, Clone, SmartDefault)]
#[config(prefix = "PREFIX", path = "tests/config")]
pub struct Test {
#[config(key = "CUSTOM_KEY")]
#[default = "World"]
name: String,
#[config(prefix = "APP")]
#[default = 3]
id: i32,
#[config(nest)]
nested: Nested,
#[config(key = "TIMEOUT_MS")]
#[default = 1000]
timeout: u64,
#[config(key = "FEATURE_ENABLED")]
#[default = false]
feature_enabled: bool,
#[default = 1.5]
ratio: f64,
#[config(nest)]
metadata: Metadata,
#[config(skip)]
#[default(Some("Unused".to_string()))]
unused_field: Option<String>,
}
#[derive(Config, Default, Clone)]
pub struct Nested {
name: String,
}
#[derive(Config, Default, Clone)]
#[config(prefix = "META", separator = "__")]
pub struct Metadata {
description: String,
version: i32,
}
然后你可以像这样加载你的设置
fn main() {
let settings = Test::config();
}
此设计旨在方便在类似 std::sync::OnceLock
的内容中使用。
考虑因素
- 版本灵活性:这是一个初始版本(v0.1.0),因此尚未完全优化。为了简单起见,实现过程中涉及一些克隆操作,这可能会影响大规模应用中的性能。
- 生产使用注意事项:这是我的第一个公开发布的Rust crate,虽然它功能完整且对我很有用,但在关键的生产环境中,如果没有经过彻底测试,尤其是在需要稳定性和性能保证的情况下,建议不要过度依赖这个库。
- 贡献:欢迎贡献!无论是功能请求、错误报告还是pull request,我都希望得到一些建设性的反馈!
强烈推荐查看
config
crate,因为它是一个功能完整的非proc-macro替代品。这个crate实际上依赖于config
进行文件解析。