我在Cargo.toml中列出了一个依赖项,需要一个特定的环境变量集。我可以在bash中运行export FOO=bar
,并且一切正常,但是对于我一生,我无法弄清楚如何在使用Cargo进行编译时导出此环境变量。我尝试通过std :: env,Command和println!在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");
}
答案 0 :(得分:12)
使用 nightly Cargo,您可以通过 configurable-env 中的 [env]
部分使用 config.toml
功能。这与 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
表示该变量可以覆盖现有的环境变量。
有关此功能历史的详细信息,请参阅 related GitHub issue。
答案 1 :(得分:0)
许多需要查找和使用已安装本机库的板条箱使用pkg-config在构建时获取该信息。也许您可以建议这种依赖性?
答案 2 :(得分:-1)
import os
import glob
import shutil
from functools import partial
from multiprocessing.pool import ThreadPool
DST_DIR = '../path/to/new/dir'
SRC_DIR = '../path/to/files/to/copy'
# copy_to_mydir will copy any file you give it to DST_DIR
copy_to_mydir = partial(shutil.copy, dst=DST_DIR))
# list of files we want to copy
to_copy = glob.glob(os.path.join(SRC_DIR, '*'))
with ThreadPool(4) as p:
p.map(copy_to_mydir, to_copy)
并且:
// build.rs
fn main() {
println!("cargo:rustc-env=FOO=bar");
}
按预期工作并打印栏。您在使用编译时宏// src/main.rs
fn main() {
println!("{}", env!("FOO"));
}
而不是运行时api env!
吗?