是否可以在构建时使用.env文件?



我是从JavaScript世界来到Rust的,在那里你可以有一个.env文件(git忽略),这个文件中的环境值可以通过npm包(比如,dotenv)在运行时可用。

当我只是cargo run项目时,我能够使用dotenvcrate使此工作类似,但在我构建发布版本后,环境变量的值丢失并且应用程序恐慌。

我知道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}");
}
}

相关内容

  • 没有找到相关文章

最新更新