dotenvy
使用std获取环境变量参数
fn main() {
// 返回Result<String, std::env::VarError>
let name = std::env::var("MYNAME");
match name {
Ok(n) => {
println!("n: {}", n)
}
Err(err) => {
eprintln!("err: {}", err)
}
}
}
cargo run
err: environment variable not found
MYNAME=aaa cargo run
n: aaa
dotenvy
在 Rust 程序启动时读取 .env 文件,并把里面的键值对加载到进程环境变量里,这样你就可以用 std::env::var() 读取配置
安装dotenvy
cargo add dotenvy
用法dotenvy获取变量
dotenv
dotenvy::dotenv().ok()它会从当前工作目录开始,向父目录逐级查找.env
MYNAME=Tom
use dotenvy::dotenv;
fn main() {
// 加载.env文件
dotenv().ok();
// 读取.env的值
let name= std::env::var("MYNAME");
match name {
Ok(n) => {
println!("n: {}", n)
}
Err(err) => {
eprintln!("err: {}", err)
}
}
}
n: Tom
找不到env文件错误信息
fn main() {
match dotenvy::dotenv() {
Ok(path) => {
println!("loaded env file: {:?}", path);
}
Err(err) => {
eprintln!("failed to load .env: {}", err);
}
}
let name = std::env::var("MYNAME");
println!("{:?}", name);
}
failed to load .env: No such file or directory (os error 2)
Err(NotPresent)
加载指定env文件
fn main() {
// 加载指定env文件
dotenvy::from_filename(".myenv").ok();
let name= std::env::var("MYNAME");
match name {
Ok(n) => {
println!("n: {}", n)
}
Err(err) => {
eprintln!("err: {}", err)
}
}
}
优先级
环境变量
- 默认情况
dotenvy不会覆盖已经存在的环境变量
MYNAME=abc
use dotenvy::dotenv;
fn main() {
dotenv().ok();
let name= std::env::var("MYNAME");
match name {
Ok(n) => {
println!("n: {}", n)
}
Err(err) => {
eprintln!("err: {}", err)
}
}
}
MYNAME=123 cargo run
n: 123
强制覆盖环境变量
MYNAME=abc
fn main() {
// 强制覆盖已有的环境变量
dotenvy::from_path_override(".env").ok();
let name= std::env::var("MYNAME");
match name {
Ok(n) => {
println!("n: {}", n)
}
Err(err) => {
eprintln!("err: {}", err)
}
}
}
MYNAME=123 cargo run
n: abc
多个.env文件时的优先级
dotenvy默认不会覆盖原有的环境变量,所以先加载的为准
dotenvy::from_path(".env").ok();
dotenvy::from_path(".env.local").ok();
覆盖
如果有相同的,那么以后加载的
from_path_override为准
dotenvy::from_path(".env").ok();
dotenvy::from_path_override(".env.local").ok(); // 覆盖已有的变量
从字符串加载env
如果需要强制覆盖,使用
dotenvy::from_read_override(input).ok();
from_read
use std::io::Cursor;
fn main() {
let input = Cursor::new("MYNAME=Jerry\nAGE=18");
dotenvy::from_read(input).ok();
println!("{}", std::env::var("MYNAME").unwrap());
println!("{}", std::env::var("AGE").unwrap());
}
cargo run
Jerry
18
只解析,不加载
只解析,不会
std::env::set_var()
dotenv_iter
它会从当前工作目录开始,向父目录逐级查找
.env文件名
fn main() {
let iter = dotenvy::dotenv_iter().unwrap();
for item in iter {
let (key, value) = item.unwrap();
println!("{} = {}", key, value);
}
}
from_path_iter
读取指定路径的env文件
fn main() {
let iter = dotenvy::from_path_iter(".myenv").unwrap();
for item in iter {
let (key, value) = item.unwrap();
println!("{} = {}", key, value);
}
}
from_filename_iter
它会从当前工作目录开始,向父目录逐级查找
.env.test文件名
fn main() {
let iter = dotenvy::from_filename_iter(".env.test").unwrap();
for item in iter {
let (key, value) = item.unwrap();
println!("{} = {}", key, value);
}
}

浙公网安备 33010602011771号