3个不稳定版本
0.2.0 | 2023年4月3日 |
---|---|
0.1.1 | 2023年3月9日 |
0.1.0 | 2022年12月29日 |
#403 在 配置
515 每月下载
45KB
475 行
构建配置的crate,从环境、命令行和文件中获取
动机
非运行时数据通常来自命令行、环境和配置文件。
有时它们同时来自每个来源,因此必须处理所有这些来源。
没有一个流行的crate(包括clap和config)能同时处理这三个来源,因此创建了此crate以解决这个问题。
基础
此crate的核心是一个属性宏 #[config]
。
使用此宏注解结构,并使用source
属性注解其字段,则该字段将在提供的来源之一中搜索。可以通过以下嵌套的source
属性提供来源
clap
:命令行参数env
:环境变量config
:配置文件键default
:默认值
示例
use config_manager::config;
#[config]
struct ApplicationConfig {
#[source(clap(long, short = 'p'), env = "APP_MODEL_PATH", config)]
model_path: String,
#[source(env, config, default = 0)]
prediction_delay: u64,
}
在上面的示例中,要设置model_path
字段的值,用户可以提供
- 命令行参数
--model_path
- 名为
model_path
的环境变量 - 包含
model_path
字段的配置文件
如果值在提供的多个来源中找到,则将按提供的顺序分配值(对于model_path字段,顺序为
clap -> env -> config
,对于prediction_delay,顺序为
env -> config -> default
)。
如果它们都没有找到(包括默认值),则程序返回错误MissingArgument
。
注意:默认值总是最后分配。
属性文档
为了进一步了解项目语法和功能,建议访问食谱。
复杂示例
use std::collections::HashMap;
use config_manager::{config, ConfigInit};
const SUFFIX: &str = "_env";
#[derive(Debug)]
#[config(
clap(version, author),
env_prefix = "demo",
file(
format = "toml",
clap(long = "config", short = 'c', help = "path to configuration file"),
env = "demo_config",
default = "./config.toml"
)
)]
struct MethodConfig {
#[source(clap(long, short))]
a: i32,
#[source(
env(init_from = "&format!(\"b{}\", SUFFIX)"),
default = "\"abc\".to_string()"
)]
b: String,
#[source(config = "bpm")]
c: i32,
#[source(default = "HashMap::new()")]
d: HashMap<i32, String>,
}
fn main() {
dbg!(MethodConfig::parse().unwrap());
}
运行
cargo run --package examples --bin demo -- --config="examples/config.toml" --a=5
结果必须是
[examples/src/demo.rs:34] &*CFG = MethodConfig {
a: 5,
b: "qwerty",
c: 165,
d: {},
}
依赖项
~3.5–4.5MB
~92K SLoC