1 个不稳定版本
0.1.0 | 2024年4月26日 |
---|
#7 in #autoconf
在 autoconf 中使用
32KB
457 行
Autoconf
一个简单的 Rust 应用程序配置宏。
由 Kidan Nelson 用 ❤️ 构建
概述
autoconf
是一个 crate,通过自动推导功能,使 Rust 应用程序的配置管理变得容易,可以从环境变量、配置文件和默认值加载设置。这是通过程序化解析结构体字段来构建环境变量键以及使用 serde
从提供的配置文件路径进行反序列化来实现的。通过几个宏属性助手来定制功能。
属性 | 功能 |
---|---|
prefix | 设置环境变量的前缀,可以在结构体或字段级别设置。 |
path | 指定配置文件的路径,可以省略扩展名。 |
key | 覆盖属性默认的键名,忽略前缀和字段名。 |
nest | 对于非标准类型是必要的,这些也必须推导 Config |
skip | 跳过从环境变量加载属性。 |
separator | 设置前缀和字段名之间放置的分隔符字符,可以在结构体或字段级别设置,默认为 "_" |
主要功能
- 简单性:最少的模板代码,只需注释您的结构和具有命名字段的单个方法的结构体。
- 灵活性:支持从环境变量、单个
toml
、json
、yaml
、xml
、ini
、ron
或json5
配置文件加载配置数据,作为后备使用默认 trait 实现。 - 集成:方便地与其他宏(例如
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包,虽然它完全功能性和对我很有用,但在没有彻底测试的情况下,特别是在需要稳定性和性能保证的情况下,不建议在生产环境中过度依赖这个库。
- 贡献:欢迎贡献!无论是功能请求、错误报告还是pull请求,我都欢迎建设性的反馈!
强烈推荐查看
config
包,因为它是一个功能完整的非proc-macro替代品。这个包实际上依赖于config
来解析文件。
依赖
~2–2.9MB
~61K SLoC