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);
    }
}
posted @ 2026-08-11 14:31  lxd670  阅读(3)  评论(0)    收藏  举报