1个不稳定版本
0.0.1 | 2024年1月24日 |
---|
#539 in #config
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
方法,该方法返回一个针对给定的 KeyPath
的 Value
。
就这样。就这么简单。现在您可以将源添加到 ConfigBuilder
并使用它来解析配置。
🔬 它是如何在内部工作的
一旦您的类型实现了 Config
特性,它就支持将键作为 KeyGraph
获取。这是一个包含该类型中所有键的图。它由 ConfigBuilder
使用,通过遍历所有键来检索添加的源中的值。
有关 Config
、ConfigBuilder
、Source
和 KeyGraph
的更多信息,请参阅文档。
依赖关系
~5–6.5MB
~127K SLoC