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

envconfig

无需模板代码即可从环境变量构建配置结构

12个版本 (重大变更)

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日

#45 in 配置

Download history 21576/week @ 2024-01-03 20552/week @ 2024-01-10 24848/week @ 2024-01-17 29823/week @ 2024-01-24 22976/week @ 2024-01-31 28812/week @ 2024-02-07 24368/week @ 2024-02-14 23405/week @ 2024-02-21 32127/week @ 2024-02-28 31761/week @ 2024-03-06 33618/week @ 2024-03-13 22921/week @ 2024-03-20 46371/week @ 2024-03-27 37590/week @ 2024-04-03 27810/week @ 2024-04-10 27056/week @ 2024-04-17

每月下载144,394
15 个Crates中使用 (11个直接使用)

MIT 许可证

12KB
118

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
~34K SLoC