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
每月下载量 251,928
用于 18 个crate(直接使用4个)
13KB
209 行
在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
许可证
贡献者
依赖项
~1.5MB
~35K SLoC