4个版本
0.2.1 | 2024年5月4日 |
---|---|
0.2.0 | 2024年5月1日 |
0.1.1 | 2024年4月27日 |
0.1.0 | 2024年4月27日 |
#191 in #settings
在confgr中使用
37KB
624 行
Confgr
一个轻量级的Rust应用程序配置推导宏。
由Ki用❤️构建
概述
Config
推导宏通过以下顺序自动从源中加载设置,简化了应用程序配置
- 环境变量.
- 配置文件(例如,
toml
,json
,yaml
,ini
,ron
,json5
)。 - 默认值.
主要功能
- 简洁性:最少的样板代码。定义您的配置结构体,自定义宏,然后即可使用。
- 灵活性:支持多种配置文件格式,包括
toml
,json
,yaml
,ini
,ron
和json5
。 - 集成:与其他crate(如
smart_default
)协同工作。
还有一些有用的辅助属性可以自定义推导宏的行为。
属性 | 功能 |
---|---|
prefix |
为环境变量设置前缀。可以在结构体或字段级别应用。 |
path |
指定配置文件的静态路径。文件扩展名可以省略(尽管可能不应该省略)。 |
env_path |
在运行时解析环境变量以确定配置文件路径。 |
default_path |
指定在env_path 确定的路径不存在时使用的回退路径。 |
key |
覆盖默认环境变量名称。此选项忽略前缀并直接使用提供的键。 |
名称 |
转发到 #[serde(rename = "_")] 在序列化/反序列化过程中重命名字段。它不影响环境变量名称。 |
嵌套 |
对于必须派生自 Config 的非标准类型,这是必需的,用于嵌套配置结构体。 |
跳过 |
跳过从环境变量中加载属性。对于未实现 FromStr 但存在于配置文件中的类型,这是必要的。 |
分隔符 |
指定一个字符来分隔前缀和字段名称。默认分隔符是 "_"。 |
路径属性行为
env_path
:将提供的环境变量解析为配置文件路径。这优先于path
和default_path
,但如果文件或环境不存在,则不会引发恐慌。path
:直接设置配置文件的路径。当设置后,不能使用default_path
。如果文件不存在,则引发恐慌。default_path
:与path
相同,但如果文件不存在,则不会引发恐慌。
用法
serde
是必需的依赖项。
[dependencies]
confgr = "0.2.0"
serde = { version = "1.0", features = ["derive"] }
然后按如下方式定义您的配置
use confgr::prelude::*;
#[derive(Config)]
#[config(path = "docs.toml", prefix = "APP")]
pub struct AppConfig {
port: u32,
address: String,
#[config(key = "DEBUG_MODE")]
debug: bool,
}
// Default implementation is required.
impl Default for AppConfig {
fn default() -> Self {
Self {
port: 3000,
address: "127.0.0.1".to_string(),
debug: false
}
}
}
std::env::set_var("APP_PORT", "4000");
std::env::set_var("DEBUG_MODE", "true");
let settings = AppConfig::load_config();
assert_eq!(settings.port, 4000);
assert_eq!(settings.address, "127.0.0.1");
assert!(settings.debug)
查看 示例目录 以获取更多信息。
警告/陷阱
- 嵌套结构体不会根据其自己的
path
属性加载单独的文件。如果您想加载多个文件,必须使用多个结构体并调用多个load_config()
调用。这可能在未来的版本中发生变化。 - 未实现
FromStr
的类型必须使用#[config(skip)]
或#[config(nest)]
。 separator
字符仅在前缀和字段名称之间插入,不会在任何解析的字段名称部分插入。prefix
按字段或整个结构体应用,但如果使用#[config(key = "_")]
,则会被忽略。- 所有配置结构体必须实现
Default
。 - 在配置结构体字段中使用的自定义类型必须实现
Deserialize
、Clone
和Debug
。 Option
目前与在实现Confgr
的类型上使用#[config)nest)]
不兼容。
调试
在遇到宏使用问题时,以下方法可能有所帮助。
验证环境变量
可以使用 get_env_keys()
方法检索由 derive 宏构建的环境变量键名。
use std::collections::HashMap;
use confgr::prelude::*;
#[derive(Config, Default)]
#[config(prefix = "APP")]
pub struct AppConfig {
port: u32,
#[config(separator = "__")]
address: String,
#[config(key = "DEBUG_MODE")]
debug: bool,
}
let keys: HashMap<String, String> = AppConfig::get_env_keys();
assert_eq!(keys["port"], "APP_PORT");
assert_eq!(keys["address"], "APP__ADDRESS");
assert_eq!(keys["debug"], "DEBUG_MODE");
验证配置文件路径
您可以使用 check_file()
来确保配置文件可通过提供的 path
、path_env
或 default_path
属性访问。
use confgr::prelude::*;
#[derive(Config, Default)]
#[config(path = "docs.toml", env_path = "APP_CONFIG_FILE")]
pub struct AppConfig {
port: u32,
debug: bool,
}
std::env::set_var("APP_CONFIG_FILE", "env_config.toml");
AppConfig::check_file().expect("Failed to open configuration file.");
std::env::remove_var("APP_CONFIG_FILE");
AppConfig::check_file().expect("Failed to open configuration file.");
测试反序列化
可以使用 deserialize_from_file()
方法手动测试配置反序列化步骤。返回一个 Result<Self::Layer, ConfgrError>
。
use confgr::prelude::\*;
#[derive(Config, Default)] #[config(path = "docs.toml")]
pub struct AppConfig {
port: u32,
debug: bool,
}
let config = AppConfig::deserialize_from_file().expect("Failed to deserialize configuration.");
println!("Deserialized configuration: {:?}", config);
注意事项
- 版本不稳定性:目前,此包处于不稳定开发阶段,我保留在未来版本中进行破坏性更改的权利,无需承担向后兼容性的义务。
- 生产使用注意事项:这是我的第一个公开的 Rust 包,虽然它功能齐全且对我很有用,但在需要稳定性和性能保证的关键生产环境中,强烈建议不要过度依赖此库,除非经过彻底测试。
- 贡献:欢迎贡献!无论是功能请求、错误报告还是拉取请求,我都非常欢迎一些建设性的反馈!
我强烈推荐查看
config
包,因为它是一个功能齐全的非-proc-macro 替代品。此包实际上依赖于config
进行文件解析。
依赖项
~270–720KB
~17K SLoC