#env #environment #env-var #configuration #configuration-management

env_struct

更好地处理环境变量的一种简单方法

5 个版本

0.1.4 2023年7月25日
0.1.3 2023年1月15日
0.1.2 2023年1月15日
0.1.1 2023年1月15日
0.1.0 2023年1月15日

#194 in 配置

MIT 许可证

12KB
166

env_struct

docs.rs/env-struct crates.io/crates/env-struct

这个 crate 是一个非常有见地的环境管理 crate,旨在培养良好的环境管理习惯,尽可能避免全局变量,并拥有合理的默认值。

仍可使用 lazy_init 来加载结构作为全局静态。但这并不是这个项目内置的。在未来,一旦 rust_std 中的新 lazy once_cell 稳定下来,就应该能够使用它。

使用示例:

use env_struct::env_struct;

env_struct! {
    #[derive(Debug)] // (Optional) Not needed, just to
    //  show that we keep derive & other macros intact
    pub struct ConfigEnvWithDefault { // vis modifiers work too
        // Will use `CONFIG_PATH`
        pub config_path = "/path/to/config.toml", 
        // Will use `RESULT_PATH`
        pub result_path = "/path/to/result.toml", 
    } 
}

pub fn main() {
    let env_config = ConfigEnvWithDefault::load_from_env();

    if let Some(s) = entry_point(&env_config) {
        eprintln!("Program exited successfullly!");
        post_run_operations(&env_config);
        // we don't care if the post run operations
        // such as cleanup or such fail.
    } else {
        eprintln!("Program exit status invalid!");
        std::process::exit(1);
    }
}

或者对于需要确保环境设置的配置:

use env_struct::env_struct;

env_struct! {
    #[derive(Debug)] // (Optional) Not needed, just to
    //  show that we keep derive & other macros intact
    pub struct RequiredConfigEnv { // vis modifiers work too
        // Will use `CONFIG_PATH`
        pub config_path, 
        // Will use `RESULT_PATH`
        pub result_path,
    }
}


pub fn main() {
    // Result<RequiredConfigEnv, String>
    // Error: String above will name the var that couldn't be read.
    let env_config = RequiredConfigEnv::try_load_from_env().unwrap();

    if let Some(s) = entry_point(&env_config) {
        eprintln!("Program exited successfullly!");
        post_run_operations(&env_config);
        // we don't care if the post run operations
        // such as cleanup or such fail.
    } else {
        eprintln!("Program exit status invalid!");
        std::process::exit(1);
    }
}

我的观点

环境变量结构体是环境管理的一个更好的选择。

因为这样你可以确保在环境之上同步的性质是符合你自己的,而且在单线程应用程序中不需要使用 Atomic,也就不需要为其支付成本。

此外,当你的系统已经有一个上下文提供者时,这也会工作得更好,例如在 GUI 应用程序中,用于依赖注入。

而且,即使只是为了通知用户缺少配置,也始终应该存在默认值。

路线图

  • 支持自定义 env_var 键别名。

依赖

无,整个项目少于 100 行代码。

贡献

欢迎提交 PR 修复任何错误或添加更多提升生活质量的特性,只需尽量遵循“保持简单”的理念。

我不想发布那些与直接相关或很快就会在 rust_std 中实现且大多数其他 crate 都提供的功能无关的功能。

这个项目应该是一个非常简单的项目。

依赖

~22KB