Cargo.toml
文件配置如下:
[package]
name = "axum"
version = "0.1.0"
authors = ["chh <[email protected]>"]
edition = "2021"
main.rs
fn main() {
let name = env!("CARGO_PKG_NAME");
let version = env!("CARGO_PKG_VERSION");
let author = env!("CARGO_PKG_AUTHORS");
println!("{} {} {}", &name, &version, &author);
}
运行结果:
axum 0.1.0 chh <1400152400@qq.com>
项目根目录新建 .env
文件,写入如下代码:
DATABASE_URL=mysql://postgres:123456@localhost:3306/test
Cargo.toml
文件配置导入以下第三方库:
[dependencies]
dotenv = "0.15.0"
main.rs
use dotenv::dotenv;
use std::env;
fn main() {
// 在访问环境变量之前检查一下,防止因读取环境变量失败导致程序恐慌。
// 先把 dotenv 导入,然后在程序开始的地方执行 dotenv() 函数即可,这就会从当前目录或父目录中的 .env 文件中加载环境变量。
// 如果你想指定其它路径,可以使用 crate 中提供的 from_filename 或 from_path 这两个函数。
// 好,那么调用 dotenv() 之后为什么还要调用 ok() 方法?
// 首先,dotenv() 返回的是 Result 类型,如果返回值不使用的话,就会发出一个警告:
// 调用 ok() 之后,会把 Result 转化为 Option,而 Option 就不会产生未使用 Result 的警告了。
// 那么,为什么不使用 unwrap()?
// 因为在生产环境中,你不会使用 .env 这个文件,你应该使用真实的环境变量,这时 dotenv() 函数就会加载失败,如果使用 unwrap(),那么你的程序就会停止运行。
// 所以这里使用 ok() 的目的就是当加载 dotenv 环境文件失败的时候可以忽略错误。
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL 没有在 .env 文件里设置");
print!("{:?}", database_url);
}
运行结果:
"mysql://postgres:123456@localhost:3306/test"
项目根目录新建 config.toml
文件,写入如下代码:
[database]
url = "postgres://postgres:123456@localhost/test"
[log]
debug = true
debug_sql = false
log_root = "/tmp"
Cargo.toml
文件配置导入以下第三方库:
[dependencies]
config = "0.13.1"
toml = "0.5.9"
lazy_static = "1.4"
serde = "1.0"
serde_derive = "1.0"
新建 settings.rs
,写入如下代码:
use std::{fs::File, io::Read};
use lazy_static::lazy_static;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct Database {
pub url: String,
}
#[derive(Debug, Deserialize)]
pub struct Log {
pub debug: bool,
pub debug_sql: bool,
pub log_root: String,
}
#[derive(Debug, Deserialize)]
pub struct Settings {
pub database: Database,
pub log: Log,
}
impl Default for Settings {
fn default() -> Self {
let file_path = "config.toml";
let mut file = match File::open(file_path) {
Ok(f) => f,
Err(e) => panic!("no such file {} exception:{}", file_path, e)
};
let mut str_val = String::new();
match file.read_to_string(&mut str_val) {
Ok(s) => s,
Err(e) => panic!("Error Reading file: {}", e)
};
toml::from_str(&str_val).expect("Parsing the configuration file failed");
}
}
impl Settings {
pub fn get<'a>() -> &'a Self {
// 给静态变量延迟赋值的宏
lazy_static! {
static ref CACHE: Settings = Settings::default();
}
&CACHE
}
}
main.rs
代码如下:
use crate::settings::Settings;
mod settings;
fn main() {
let setting = Settings::get();
println!("{:?}", setting.database.url);
println!("{:?}", setting.log);
}
运行结果:
"postgres://postgres:123456@localhost/test"
Log { debug: true, debug_sql: false, log_root: "/tmp" }