#proc-macro #cli

scuffle-config

可扩展配置解决方案

1个不稳定版本

0.0.1 2024年1月24日

#539 in #config

MIT许可证

120KB
3.5K SLoC

⚙️ 配置

有人说

配置解决方案绝对糟糕

这个crate试图解决这个问题,让它不再那么糟糕。

它内置了对解析CLI参数、环境变量和文件的支持,无需您编写超过配置结构定义的内容。这个crate的另一个目标是可扩展性,并允许您编写自己的来源。例如,您可以实现数据库或远程服务的配置来源。有关更多信息,请参阅高级用法

🚀 如何使用它

由于这个crate建立在serde之上,请将serde作为依赖项添加到您的Cargo.toml

cargoadd serde --功能derive

之后,您可以使用#[derive(Config)]宏调用来为您的配置结构推导出Config特质。所有实现Config的结构也必须实现serde::Deserialize

#[derive(config::Config, serde::Deserialize)]
struct MyConfig {
    // ...
}

现在您可以使用ConfigBuilder来解析来自各种来源的配置,并将其合并到您的配置结构中。

use config::sources;

#[derive(config::Config, serde::Deserialize)]
struct MyConfig {
    // ...
}

fn main() -> Result<(), config::ConfigError> {
    let mut builder = config::ConfigBuilder::new();
    // From CLI arguments
    builder.add_source(sources::CliSource::new()?);
    // From environment variables
    builder.add_source(sources::EnvSource::with_prefix("TEST")?);
    // From config file
    builder.add_source(sources::FileSource::with_path("config.toml")?);

    // Build the final configuration
    let config: MyConfig = builder.build()?;

    // ...

    Ok(())
}
  • 第一行创建一个新的ConfigBuilder
  • 下一行将CliSource添加到构建器中,该构建器使用clap crate来解析CLI参数。您可以使用--help调用您的可执行文件以查看生成的帮助消息。
  • 第三行将EnvSource添加到构建器中,该构建器使用指定的前缀解析环境变量。
  • 第三个源,称为 FileSource,用于从指定路径的文件中解析配置。文件格式将在运行时自动检测。可以是 TOML、YAML 或 JSON。
  • 最后,您可以调用 build 来构建最终的配置。这将解析所有源并将它们合并到您的配置结构中。添加源的时间越早,其优先级越高。这意味着后来添加的源的值将 不会 覆盖较早添加的源的值。

示例

请参阅 示例 文件夹以获取示例。

🔧 高级用法

如何定义自己的配置源

要定义自己的配置源,您需要实现 Source 特性。

这需要您实现 get_key 方法,该方法返回一个针对给定的 KeyPathValue

就这样。就这么简单。现在您可以将源添加到 ConfigBuilder 并使用它来解析配置。

🔬 它是如何在内部工作的

一旦您的类型实现了 Config 特性,它就支持将键作为 KeyGraph 获取。这是一个包含该类型中所有键的图。它由 ConfigBuilder 使用,通过遍历所有键来检索添加的源中的值。

有关 ConfigConfigBuilderSourceKeyGraph 的更多信息,请参阅文档。

依赖关系

~5–6.5MB
~127K SLoC