#configuration #toml-config #settings #env-var

grafton-config

从toml文件加载配置,支持令牌变量扩展和环境覆盖

4个版本

0.2.1 2024年7月4日
0.2.0 2024年7月3日
0.1.3 2024年7月3日
0.1.1 2024年7月3日

#96 in 配置

每月下载44

Apache-2.0

45KB
1K SLoC

grafton-config

grafton-config 是一个基于Rust的配置库,为Rust应用程序提供TOML格式配置文件的标记扩展和分层配置加载功能。

特点

  • 从多个TOML文件分层加载配置
  • 在配置文件内动态扩展标记
  • 支持特定环境的配置
  • 灵活且可扩展的设计

为什么配置很重要

强大的配置管理对于

  1. 环境灵活性: 您的应用程序需要适应各种环境(开发、预发布、生产)。
  2. 安全性: 必须小心处理敏感信息,如API密钥。
  3. 可扩展性: 随着您的应用程序增长,其配置的复杂性也会增加。

grafton-config 解决这些挑战,为Rust开发者提供全面的解决方案。

安装

grafton-config 添加到您的 Cargo.toml

[dependencies]
grafton-config = "*"

使用

定义您的配置结构

让我们创建一个基本的配置结构

use serde::{Deserialize, Serialize};
use grafton_config::TokenExpandingConfig;

#[derive(Debug, Serialize, Deserialize)]
struct Server {
    host: String,
    port: u16,
    database_url: String,
}

#[derive(Debug, Serialize, Deserialize)]
struct AppConfig {
    server: Server,
}

impl TokenExpandingConfig for AppConfig {}

此结构以清晰、类型安全的方式表示您的应用程序配置。

加载您的配置

use grafton_config::{load_config_from_dir, TokenExpandingConfig, Error};

fn main() -> Result<(), Error> {
    let config = grafton_config::load_config_from_dir::<AppConfig>("examples/config")?;
    println!("Database URL: {}", config.server.database_url);
    Ok(())
}

示例

要运行存储库中的示例,请使用以下命令

cargo run --example config_example

分层配置:核心的灵活性

grafton-config 支持分层配置,允许为不同的环境设置不同的设置。

配置文件:

配置是从以下文件在指定目录中加载的

  1. default.toml:您的基配置(必需)
  2. local.toml:本地覆盖(可选)
  3. {run_mode}.toml:特定环境的配置(可选)

run_modeRUN_MODE 环境变量确定,如果未设置,则默认为 dev。文件按上述顺序加载,后面的文件覆盖前面的文件中的任何值。

示例设置:

default.toml:

[server]
host = "localhost"
port = 5432
database_url = "postgresql://user:password@${server.host}:${server.port}/mydb"

local.toml(可选,用于本地开发)

[server]
host = "127.0.0.1"

prod.toml(可选,用于生产。参见上面的run_mode)

[server]
host = "db.production.com"
database_url = "postgresql://user:password@${server.host}:${server.port}/mydb"

令牌扩展:从基础到高级使用

令牌扩展是 grafton-config 的一个关键特性。它允许您在配置中引用其他值,使其更加动态并减少冗余。

基本令牌使用

令牌使用 ${key_path} 语法,其中 key_path 是到所需值的点分隔路径。

[database]
host = "db.example.com"
port = 5432
url = "postgresql://user:password@${database.host}:${database.port}/mydb"

高级令牌使用

  1. 嵌套路径:

    [person]
    first_name = "John"
    last_name = "Doe"
    full_name = "${person.first_name} ${person.last_name}"
    
  2. 数组访问:

    fruits = ["apple", "banana", "cherry"]
    favorite = "My favorite fruit is ${fruits.1}"
    
  3. 转义令牌:

    literal = "This is a \${literal} dollar sign"
    

处理边缘情况

grafton-config 优雅地处理各种场景

  • 循环引用:为了防止无限循环,存在递归限制(目前为99)。
  • 部分展开:如果令牌无法完全展开,则无法展开的部分保持不变。
  • 类型处理:令牌可以展开为各种 TOML 数据类型,包括字符串、整数、浮点数、布尔值和日期时间。

API 参考

  • load_config_from_dir(path: &str) -> Result<T, Error>:从目录中加载和解析配置
  • GraftonConfig:grafton-configuration 结构体的特质
  • TokenExpandingConfig:支持令牌展开的配置结构体的特质

贡献

欢迎贡献!请随时提交拉取请求。

许可证

grafton-config 根据 Apache License 2.0(用于开源使用)和商业许可证进行双重授权。

开源许可证

除非明确声明,否则此存储库中的所有文件均根据 Apache License 2.0 许可。许可证的完整文本可以在 LICENSE 文件中找到。

Apache License 2.0 的主要特点

  • 许可宽松:允许免费商业和非商业使用、分发和修改软件,而无需访问源代码。
  • 明确专利许可:授予所有贡献者向用户授予的明确专利许可。
  • 专利报复条款:保护用户和贡献者免受专利侵权索赔。

商业许可证

对于希望将 grafton-config 集成到闭源应用程序或需要比 Apache License 2.0 允许的更多灵活性的用户,提供商业许可证。有关商业许可查询,请联系 [email protected]

依赖关系

~3.5–5.5MB
~102K SLoC