在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用 dotenv 这个 crate。
首先在项目中添加 dotenv 这个依赖:
例如在下面这个项目中,需要设置数据库连接字符串和 Debug 等级这两个环境变量。在开发环境下,我们可以在项目根目录下创建 .env 这个文件:
在 .env 文件里,我们设置两个环境变量,分别是 DB_URL 和 LOG_LEVEL:
下面来到 main.rs,想要访问系统的环境变量,我们使用标准库的 std::env 即可:
这里,我们先把获取到的环境变量进行遍历和打印,然后再分别尝试打印 PATH、DB_URL 和 LOG_LEVEL 这三个环境变量的值。
结果如下:
我们可以看到,前面是遍历打印的环境变量,后边打印出了 PATH 的值。然后在尝试获取 DB_URL 值的时候程序就恐慌了,因为没有找到这个环境变量。
现在我们使用 dotenv 这个 crate:
先把 dotenv 导入,然后在程序开始的地方执行 dotenv() 函数即可,这就会从当前目录或父目录中的 .env 文件中加载环境变量。
如果你想指定其它路径,可以使用 crate 中提供的 from_filename 或 from_path 这两个函数。
好,那么调用 dotenv() 之后为什么还要调用 ok() 方法?
首先,dotenv() 返回的是 Result
调用 ok() 之后,会把 Result 转化为 Option,而 Option 就不会产生未使用 Result 的警告了。
那么,为什么不使用 unwrap()?
因为在生产环境中,你不会使用 .env 这个文件,你应该使用真实的环境变量,这时 dotenv() 函数就会加载失败,如果使用 unwrap(),那么你的程序就会停止运行。
所以这里使用 ok() 的目的就是当加载 dotenv 环境文件失败的时候可以忽略错误。
代码:
1 use std::env;
2 use dotenv::dotenv;
3
4 fn main() {
5 dotenv().ok();
6
7 for (k, v) in env::vars() {
8 println!("{}: {}", k, v);
9 }
10
11 println!("PATH: {}", env::var("PATH").unwrap());
12 println!("DB: {}", env::var("DB_URL").unwrap());
13 println!("LOG: {}", env::var("LOG_LEVEL").unwrap());
14 }