#env-var #env #dotenv #configuration #load #combine #thread-safe

envsafe

Rust库,用于安全地将dotenv文件与现有环境变量结合

1个不稳定版本

0.1.0 2024年7月29日

#181 in 配置

Download history 132/week @ 2024-07-28 3/week @ 2024-08-04

每月135次下载

MIT许可证

11KB
227

envsafe (WIP)

在Rust中加载.env文件,无需使用unsafe!

# .env
SOME_ENV_VAR='Hello envsafe'
// main.rs
use std::error::Error as StdError;

fn main() -> Result<(), Box<dyn StdError>> {
    let safe = envsafe::load()?;

    if let Some(var) = safe.get("SOME_ENV_VAR") {
        println!("SOME_ENV_VAR: {var}");
    }
}

功能

envsafe将环境视为只读 - 将现有变量与dotenv文件合并到一个映射中。因此,它是线程安全的

默认行为

  • 加载所有环境变量
  • 如果存在,则加载.env文件
    • 如果.env有语法错误,则报错
    • 不覆盖现有变量

配置

使用EnvSafeConfig自定义加载EnvSafe的方式。您可以指定:

  • 多个.env文件
  • 覆盖行为
  • 加载顺序
  • 错误忽略
  • 基于环境的多种策略

以下示例始终尝试加载common.env

如果变量APP_ENV设置为DEV,它将首先加载环境,然后加载dev.env。如果文件不存在或存在语法错误,将覆盖所有现有变量。

如果APP_ENV设置为PROD,它将加载prod.env并且随后加载环境。所有错误都将被忽略。

EnvSafeConfig::<MAX_ENV_FILES, MAX_APP_ENVS>::new()
    .add_envfile("common.env")
    .app_env_config(
        AppEnvConfig::new("APP_ENV")
            .add_app_env(
                "DEV",
                EnvConfig::new()
                    .add_envfile_override("dev.env")
                    .sequence(EnvSequence::EnvThenFiles)
                    .errors(ErrorReturn::All),
            )
            .add_app_env(
                "PROD",
                EnvConfig::new()
                    .add_envfile("prod.env")
                    .sequence(EnvSequence::FilesThenEnv)
                    .errors(ErrorReturn::None),
            ),
    )
    .load()
    .unwrap();

内存分配

仅在堆上分配EnvSafe。所有配置都保持在栈上,并在加载EnvSafe时丢弃。这就是为什么我们在上面的示例中指定了MAX_ENV_FILESMAX_APP_ENVS的原因。

比较

dotenvy目前修改环境,这在基于Unix的多线程程序中是不安全的。这种安全性很容易强制执行,但如果您不想使用unsafeenvsafe可能是一个更好的选择。有关更多详细信息,请参阅此问题

贡献

感谢您考虑为envsafe做出贡献!

我们欢迎任何形式的贡献

  • 新问题(功能请求、错误报告、问题、想法等)
  • 拉取请求(文档改进、代码改进、新功能等)

注意:在您花费时间打开拉取请求之前,请先打开一个问题。

许可证

envsafeMIT 许可证 下发行。

依赖

~0.6–1MB
~13K SLoC