#配置管理 #配置 #环境变量 #yaml配置 #toml配置 #serde

confique

类型安全、分层、轻量级的基于 serde 的配置库

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配置

Download history 923/week @ 2024-04-22 1301/week @ 2024-04-29 1280/week @ 2024-05-06 1947/week @ 2024-05-13 1448/week @ 2024-05-20 1128/week @ 2024-05-27 758/week @ 2024-06-03 917/week @ 2024-06-10 985/week @ 2024-06-17 835/week @ 2024-06-24 783/week @ 2024-07-01 874/week @ 2024-07-08 858/week @ 2024-07-15 896/week @ 2024-07-22 928/week @ 2024-07-29 676/week @ 2024-08-05

3,484 每月下载量
11 crates 中使用

MIT/Apache

88KB
1.5K SLoC

Confique:类型安全、分层配置库

CI status of main Crates.io Version docs.rs

Confique 是一个相当轻量级的库,以类型安全和DRY(不要重复)的方式帮助进行配置管理。

特性:

  • 类型安全:使用配置值的代码不需要解析字符串或 unwrap 任何 Option。所有值都已具有正确的类型。
  • 分层配置:您可以加载并合并多个配置源。
  • 从以下位置加载配置值:
    • 环境变量
    • 文件:TOMLYAMLJSON5
    • 任何具有 serde 解析器的对象
  • 基于 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>()
# Port to listen on.
#
# Can also be specified via
# environment variable `PORT`.
#
# Default value: 8080
#port = 8080

# Bind address.
#
# Default value: "127.0.0.1"
#address = "127.0.0.1"

[log]
# <omitted>
# Port to listen on.
#
# Can also be specified via
# environment variable `PORT`.
#
# Default value: 8080
#port: 8080

# Bind address.
#
# Default value: 127.0.0.1
#address: 127.0.0.1

log:
  # <omitted>
{
  // Port to listen on.
  //
  // Can also be specified via
  // environment variable `PORT`.
  //
  // Default value: 8080
  //port: 8080,

  // Bind address.
  //
  // Default value: "127.0.0.1"
  //address: "127.0.0.1",

  log: {
    // <omitted>
  },
}

(注意:环境变量句子是单行的;我只是将其分成两行,以便在本README中提高可读性。)

与其他库/解决方案的比较

config

  • 弱类型
    • 您通过字符串路径访问配置值(例如 "http.port")并在“使用位置”进行反序列化。
    • 没有定义的模式
  • 更多功能
  • 更大的库
  • 如果您需要“配置模板”,则需要重复代码/文档

figment

  • 也是基于 serde,并且还使用您自己的结构作为数据存储,因此是类型安全的
  • 而不是使用部分类型,而是在动态数据存储中聚合不同的层
  • 如果您需要“配置模板”,则需要重复代码/文档

仅仅是 serde 吗?

Serde 不是一个配置工具,而是一个反序列化库。但仅使用 serde 就可以出奇地远,可能实际上足以满足您的项目需求。然而,一旦您想要从多个来源加载,您就必须将所有字段设置为 Option 或重复代码/文档。使用 confique 您还可以获得一些其他有用的辅助工具。

本项目的状态

仍然有一些设计空间可以探索,当然还可以添加许多功能。然而,核心接口( derive 宏和核心特质)可能不会发生太多变化。Confique 被一个网络项目(已在生产中使用)使用,该项目是我与 confique 一起开发的。



许可证

根据您的选择,此项目受Apache 许可证 2.0 版本MIT 许可证许可。除非您明确表示,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此项目中的任何贡献,均应按上述方式双重许可,而无需任何额外条款或条件。

依赖项

~5MB
~99K SLoC