如何让Rust Release二进制文件正确读取.env环境变量?
解决Rust二进制文件无法读取.env的问题
问题根源
在Mac上用open命令启动二进制文件时,程序的工作目录并非二进制文件所在目录,而是当前用户的Home目录(~/)。dotenv::dotenv()默认会在工作目录下查找.env文件,所以即便你把.env复制到二进制同目录,程序也无法定位到它。而cargo run会自动将工作目录设为项目根目录,因此能正常加载.env。
解决方案
1. 终端直接运行二进制(最简单方案)
打开终端,切换到二进制文件所在目录:
cd /path/to/your/project/target/release
直接执行二进制文件:
./your-binary-name
此时程序工作目录与二进制文件一致,可正常读取同目录下的.env。
2. 用脚本指定工作目录启动(适配图形化启动场景)
如果需要通过图形化方式启动,可借助osascript命令让终端在正确目录下启动程序:
osascript -e 'tell application "Terminal" to do script "cd /path/to/your/project/target/release && ./your-binary-name"'
该命令会打开新终端窗口,自动切换到二进制目录并启动程序,确保工作目录正确。
3. 修改代码强制加载二进制目录下的.env(通用方案)
修改Rust代码,让程序主动获取自身所在目录,加载该目录下的.env,无论从何种方式启动都能定位到文件:
use dotenv; use std::env; use std::path::PathBuf; fn main() { // 获取二进制文件的绝对路径 let exe_path = env::current_exe().expect("无法获取可执行文件路径"); // 提取二进制所在目录 let exe_dir = exe_path.parent().expect("无法获取可执行文件所在目录"); // 拼接.env文件路径 let env_file_path = exe_dir.join(".env"); // 加载指定路径的.env文件 if let Err(e) = dotenv::from_path(env_file_path) { eprintln!("加载.env文件失败: {}", e); } // 后续业务逻辑... }
修改后重新执行cargo build --release构建,此时无论用open还是其他方式启动,程序都能正确读取.env。
内容的提问来源于stack exchange,提问作者Antonin GAVREL
相关产品推荐
相关产品推荐

