#命令行 #配置 #环境 #配置管理 #环境变量 #

config-manager

构建配置的crate,从环境、命令行和文件中获取

3个不稳定版本

0.2.0 2023年4月3日
0.1.1 2023年3月9日
0.1.0 2022年12月29日

#403配置

Download history 211/week @ 2024-03-13 198/week @ 2024-03-20 133/week @ 2024-03-27 198/week @ 2024-04-03 243/week @ 2024-04-10 123/week @ 2024-04-17 275/week @ 2024-04-24 107/week @ 2024-05-01 82/week @ 2024-05-08 162/week @ 2024-05-15 227/week @ 2024-05-22 152/week @ 2024-05-29 152/week @ 2024-06-05 82/week @ 2024-06-12 125/week @ 2024-06-19 106/week @ 2024-06-26

515 每月下载

MIT 许可证

45KB
475

构建配置的crate,从环境、命令行和文件中获取

动机

非运行时数据通常来自命令行、环境和配置文件。
有时它们同时来自每个来源,因此必须处理所有这些来源。
没有一个流行的crate(包括clapconfig)能同时处理这三个来源,因此创建了此crate以解决这个问题。

基础

此crate的核心是一个属性宏 #[config]
使用此宏注解结构,并使用source属性注解其字段,则该字段将在提供的来源之一中搜索。可以通过以下嵌套的source属性提供来源

  1. clap:命令行参数
  2. env:环境变量
  3. config:配置文件键
  4. 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