#env-var #environment #env #configuration #macro

envconfig derive

从环境变量中构建配置结构,无需样板代码

11个版本 (破坏性更新)

0.10.0 2021年6月8日
0.9.1 2020年10月9日
0.8.0 2020年3月31日
0.6.0 2019年12月22日
0.5.0 2018年9月25日

#156 in #env-vars

Download history 34241/week @ 2024-03-14 22971/week @ 2024-03-21 55461/week @ 2024-03-28 27240/week @ 2024-04-04 30829/week @ 2024-04-11 34360/week @ 2024-04-18 31714/week @ 2024-04-25 36708/week @ 2024-05-02 33643/week @ 2024-05-09 64385/week @ 2024-05-16 61989/week @ 2024-05-23 52918/week @ 2024-05-30 66846/week @ 2024-06-06 62730/week @ 2024-06-13 55696/week @ 2024-06-20 54512/week @ 2024-06-27

每月下载量 251,928
用于 18 个crate(直接使用4个)

MIT 许可证

13KB
209

Envconfig logo

Build Status License Documentation

在Rust中从环境变量初始化配置结构,无需样板代码。

用法

假设你的应用程序依赖于以下环境变量

  • DB_HOST
  • DB_PORT

并且你希望初始化 Config 结构,如下所示

struct Config {
    host: String,
    port: u16,
}

你可以使用以下代码实现这一点,无需样板代码

use envconfig::Envconfig;

#[derive(Envconfig)]
pub struct Config {
    #[envconfig(from = "DB_HOST")]
    pub db_host: String,

    #[envconfig(from = "DB_PORT", default = "5432")]
    pub db_port: u16,
}

fn main() {
    // Assuming the following environment variables are set
    std::env::set_var("DB_HOST", "127.0.0.1");

    // Initialize config from environment variables or terminate the process.
    let config = Config::init_from_env().unwrap();

    assert_eq!(config.db_host, "127.0.0.1");
    assert_eq!(config.db_port, 5432);
}

测试

在编写测试时,应避免使用环境变量。Cargo默认并行运行Rust测试,这意味着如果有两个或多个测试争用环境变量,你的测试可能会出现竞态条件。

为了解决这个问题,你可以在测试中从 struct 初始化一个 HashMap<String, String>。这个 HashMap 应该匹配你期望的真实环境变量;例如,DB_HOST 环境变量成为你的 HashMap 中的 DB_HOST 键。

use envconfig::Envconfig;

#[derive(Envconfig)]
pub struct Config {
    #[envconfig(from = "DB_HOST")]
    pub db_host: String,

    #[envconfig(from = "DB_PORT", default = "5432")]
    pub db_port: u16,
}

#[test]
fn test_config_can_be_loaded_from_hashmap() {
    // Create a HashMap that looks like your environment 
    let mut hashmap = HashMap::new();
    hashmap.insert("DB_HOST".to_string(), "127.0.0.1".to_string());

    // Initialize config from a HashMap to avoid test race conditions
    let config = Config::init_from_hashmap(&hashmap).unwrap();

    assert_eq!(config.db_host, "127.0.0.1");
    assert_eq!(config.db_port, 5432);
}

贡献

运行测试

测试对环境变量进行了某些操作,因此为了防止测试不稳定,它们必须在一个线程中执行

cargo test -- --test-threads=1

许可证

MIT © Sergey Potapov

贡献者

  • greyblake Potapov Sergey - 创建者,维护者。
  • allevo Tommaso Allevi - 支持嵌套结构
  • hobofan Maximilian Goisser - 更新依赖项

依赖项

~1.5MB
~35K SLoC