我是从JavaScript世界来到Rust的,在那里你可以有一个.env
文件(git忽略),这个文件中的环境值可以通过npm包(比如,dotenv
)在运行时可用。
当我只是cargo run
项目时,我能够使用dotenv
crate使此工作类似,但在我构建发布版本后,环境变量的值丢失并且应用程序恐慌。
我知道cargo
不会在构建时评估环境变量,并且使用env!
类宏也不会工作,至少我最好的理解。
我要问的是:我如何在文件中存储变量(我可以忽略),使Rust从该文件中获取值,并在构建时使用它们,以便这些值可用于发布构建的应用程序?
我确信有一种行之有效的方法可以做到这一点,但我很难找出它。
dotenv-codegen crate提供了一个dotenv!
宏,它的工作方式与env!
宏类似,只是它将从.env
文件加载。
我不确定这是否已经建立,但是您可以使用构建脚本读取文件并使用println!("cargo:rustc-env=VAR=VALUE")
将环境变量发送给Cargo,从而允许您在使用env!()
或option_env!()
的代码中检索它们。
例如,要使用.env
文件,将dotenv
添加到build-dependencies
,并在build.rs:
fn main() {
let dotenv_path = dotenv::dotenv().expect("failed to find .env file");
println!("cargo:rerun-if-changed={}", dotenv_path.display());
// Warning: `dotenv_iter()` is deprecated! Roll your own or use a maintained fork such as `dotenvy`.
for env_var in dotenv::dotenv_iter().unwrap() {
let (key, value) = env_var.unwrap();
println!("cargo:rustc-env={key}={value}");
}
}