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 配置
每月下载144,394次
在 15 个Crates中使用 (11个直接使用)
12KB
118 行
在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
~34K SLoC