如何使用Cargo设置环境变量?

42

我在Cargo.toml中列出了一个依赖项,需要设置特定的环境变量。 我可以在bash中运行export FOO=bar,一切正常,但是我无论如何都想不出如何在Cargo编译时导出此环境变量。 我已经尝试通过std::envCommandprintln!build.rs中设置环境变量,但都没有效果:

// build.rs
fn main() {
    Command::new("ls")
        .env("FOO", "bar")
        .spawn()
        .expect("ls command failed to start");
}
// build.rs
fn main() {
    std::env::set_var("FOO", "bar");
}
// build.rs
fn main() {
    println!("cargo:rustc-env=FOO=bar");
}

8
这并不是重复内容。我想要设置一个编译时的环境变量,而链接提到了一个运行时的环境变量。请帮我翻译这段话。 - mandeep
2
我不确定是否可能,参见https://github.com/rust-lang/cargo/issues/4121。 - Stargateur
1
问题中的依赖是什么?它如何使用环境变量? - SirDarius
这个 crate 是 oidn-rs,看起来需要设置 OIDN_DIR 和 LD_LIBRARY_PATH。我已经在问题追踪器上联系了,看看是否可以在 crate 级别解决这个问题。我看到了 cargo-make,但宁愿不使用另一个 crate 来完成这个任务。目前看起来 Cargo 问题跟踪器上的问题 4121 就是需要实现的。 - mandeep
1
@Stargateur 这是正确的英语(来源:一生都在说英语)。 “但是”这里不是指“除了”,而是作为接下来从句的连词。 - JMAA
显示剩余2条评论
1个回答

49
自 Cargo 1.56 起,您可以通过configurable-env特性,在config.toml中的[env]部分进行使用。这不是Cargo.toml文件,但仍然可以按项目设置:
[env]
FOO = "bar"
PATH_TO_SOME_TOOL = { value = "bin/tool", relative = true }
USERNAME = { value = "test_user", force = true }

此部分设置的环境变量将应用于 Cargo 执行的任何进程的环境中。

relative 表示该变量表示相对于包含 .cargo/ 目录的目录位置的路径,该目录还包含 config.toml 文件。

force 表示变量可以覆盖现有环境变量。

有关此功能历史的更多信息,请参见相关的 GitHub 问题


1
我不这么认为,cargo的仓库上关于这个功能的问题已经被实现该功能的PR关闭了,我也没有看到任何替代方案。我猜你可以在此期间使用一个bash脚本。 - Pâris Douady
1
在结尾处添加了一个链接。 - Pâris Douady
我将 Cargo 升级到 1.52 并创建了文件:项目根目录 > .cargo > config.toml。但是 env::var("FOO") 没有找到任何内容。已重启 VSCode,并从终端和 VSCode 运行了我的测试。 - User
2
这些是为 cargo 执行的进程设置的环境变量,_不是_用于最终二进制文件的!例如,这对于构建 C 依赖项非常有用。 请参见 https://dev59.com/2lUK5IYBdhLWcg3wlQoJ 以了解如何实现您想要的内容。 - Pâris Douady
2
如果设置了 --release,是否可以设置不同的环境变量? - Felipe
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接