1个不稳定版本
0.1.0 | 2024年7月29日 |
---|
#181 in 配置
每月135次下载
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_FILES
和MAX_APP_ENVS
的原因。
比较
dotenvy
目前修改环境,这在基于Unix的多线程程序中是不安全的。这种安全性很容易强制执行,但如果您不想使用unsafe
:envsafe
可能是一个更好的选择。有关更多详细信息,请参阅此问题。
贡献
感谢您考虑为envsafe做出贡献!
我们欢迎任何形式的贡献
- 新问题(功能请求、错误报告、问题、想法等)
- 拉取请求(文档改进、代码改进、新功能等)
注意:在您花费时间打开拉取请求之前,请先打开一个问题。
许可证
envsafe
在 MIT 许可证 下发行。
依赖
~0.6–1MB
~13K SLoC