如何使用货运设置环境变量?

时间:2019-07-13 07:27:11

标签: rust cargo

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

3 个答案:

答案 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!吗?