11个版本
0.2.5 | 2023年12月10日 |
---|---|
0.2.4 | 2023年7月2日 |
0.2.3 | 2023年3月10日 |
0.2.2 | 2022年11月25日 |
0.1.0 | 2021年7月28日 |
#13 在 配置
3,484 每月下载量
在 11 crates 中使用
88KB
1.5K SLoC
Confique:类型安全、分层配置库
Confique 是一个相当轻量级的库,以类型安全和DRY(不要重复)的方式帮助进行配置管理。
特性:
- 类型安全:使用配置值的代码不需要解析字符串或
unwrap
任何Option
。所有值都已具有正确的类型。 - 分层配置:您可以加载并合并多个配置源。
- 从以下位置加载配置值:
- 基于
serde
:在confique
中更少的代码(更轻量级),并访问高质量的解析器的大量生态系统。 - 轻松生成配置“模板”:描述所有可用的配置值,而无需重复。
简单示例
use std::{net::IpAddr, path::PathBuf};
use confique::Config;
#[derive(Config)]
struct Conf {
/// Port to listen on.
#[config(env = "PORT", default = 8080)]
port: u16,
/// Bind address.
#[config(default = "127.0.0.1")]
address: IpAddr,
#[config(nested)]
log: LogConf,
}
#[derive(Config)]
struct LogConf {
#[config(default = true)]
stdout: bool,
file: Option<PathBuf>,
#[config(default = ["debug"])]
ignored_modules: Vec<String>,
}
let config = Conf::builder()
.env()
.file("example-app.toml")
.file("/etc/example-app/config.toml")
.load()?;
有关更多信息,请参阅 文档。
配置模板
使用上述示例,您可以自动生成配置模板:一个文件,以所选格式列出所有值及其描述、默认值和环境值。
toml::template::<Conf>() |
yaml::template::<Conf>() |
json5::template::<Conf>() |
|
|
|
(注意:环境变量句子是单行的;我只是将其分成两行,以便在本README中提高可读性。)
与其他库/解决方案的比较
config
- 弱类型
- 您通过字符串路径访问配置值(例如
"http.port"
)并在“使用位置”进行反序列化。 - 没有定义的模式
- 您通过字符串路径访问配置值(例如
- 更多功能
- 更大的库
- 如果您需要“配置模板”,则需要重复代码/文档
figment
- 也是基于
serde
,并且还使用您自己的结构作为数据存储,因此是类型安全的 - 而不是使用部分类型,而是在动态数据存储中聚合不同的层
- 如果您需要“配置模板”,则需要重复代码/文档
仅仅是 serde
吗?
Serde 不是一个配置工具,而是一个反序列化库。但仅使用 serde 就可以出奇地远,可能实际上足以满足您的项目需求。然而,一旦您想要从多个来源加载,您就必须将所有字段设置为 Option
或重复代码/文档。使用 confique
您还可以获得一些其他有用的辅助工具。
本项目的状态
仍然有一些设计空间可以探索,当然还可以添加许多功能。然而,核心接口( derive 宏和核心特质)可能不会发生太多变化。Confique 被一个网络项目(已在生产中使用)使用,该项目是我与 confique 一起开发的。
许可证
根据您的选择,此项目受Apache 许可证 2.0 版本或MIT 许可证许可。除非您明确表示,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此项目中的任何贡献,均应按上述方式双重许可,而无需任何额外条款或条件。
依赖项
~5MB
~99K SLoC