07-环境变量
13 分钟阅读
译文 · 基于 The Cargo Book
环境变量
原文链接: https://doc.rust-lang.org/cargo/reference/environment-variables.html
Cargo 会设置并读取若干环境变量,你的代码可以检测或覆盖它们。以下按 Cargo 与之交互的时机,列出 Cargo 设置的环境变量:
Cargo 读取的环境变量
你可以覆盖这些环境变量,以改变 Cargo 在你系统上的行为:
CARGO_LOG— Cargo 使用tracingcrate 显示调试日志消息。可将CARGO_LOG环境变量设为trace、debug或warn等值以启用调试日志。通常仅在调试时使用。更多细节见调试日志。CARGO_HOME— Cargo 在本地缓存 registry 索引与 crate 的 git 检出。默认存放在$HOME/.cargo(Windows 上为%USERPROFILE%\.cargo),此变量可覆盖该目录位置。crate 一旦被缓存,clean命令不会将其移除。更多细节见指南。CARGO_TARGET_DIR— 所有生成产物的存放位置,相对于当前工作目录。也可通过build.target-dir在配置中设置。CARGO— 若已设置,Cargo 在构建 crate、执行构建脚本及外部子命令时会转发该值,而不是使用其自动检测到的路径。Cargo 不会直接执行该值,它应始终指向与cargo行为完全一致的命令,因为使用该变量的用户会期望如此。RUSTC— Cargo 将执行此指定的编译器,而不是运行rustc。也可通过build.rustc在配置中设置。RUSTC_WRAPPER— Cargo 将执行此指定的包装器,而不是直接运行rustc;包装器的命令行参数为 rustc 调用,第一个参数为实际 rustc 的路径。可用于设置sccache等构建缓存工具。也可通过build.rustc-wrapper在配置中设置。设为空字符串会覆盖配置,使 cargo 不再使用包装器。RUSTC_WORKSPACE_WRAPPER— 对于工作空间成员,Cargo 将执行此指定的包装器,而不是直接运行rustc;包装器的命令行参数为 rustc 调用,第一个参数为实际 rustc 的路径。在不含工作空间的单包项目中,该包被视为工作空间。它会影响文件名哈希,使包装器产生的产物单独缓存。也可通过build.rustc-workspace-wrapper在配置中设置。设为空字符串会覆盖配置,使 cargo 不再对工作空间成员使用包装器。若同时设置了RUSTC_WRAPPER与RUSTC_WORKSPACE_WRAPPER,它们会嵌套:最终调用为$RUSTC_WRAPPER $RUSTC_WORKSPACE_WRAPPER $RUSTC。RUSTDOC— Cargo 将执行此指定的rustdoc实例,而不是运行rustdoc。也可通过build.rustdoc在配置中设置。RUSTDOCFLAGS— 传给 Cargo 执行的所有rustdoc调用的自定义标志的空格分隔列表。与cargo rustdoc不同,这适用于向所有rustdoc实例传递标志。更多设置方式见build.rustdocflags。该字符串按空白分割;若要更稳健地编码多个参数,见CARGO_ENCODED_RUSTDOCFLAGS。CARGO_ENCODED_RUSTDOCFLAGS— 传给 Cargo 执行的所有rustdoc调用的自定义标志列表,以0x1f(ASCII 单元分隔符)分隔。RUSTFLAGS— 传给 Cargo 执行的所有编译器调用的自定义标志的空格分隔列表。与cargo rustc不同,这适用于向所有编译器实例传递标志。更多设置方式见build.rustflags。该字符串按空白分割;若要更稳健地编码多个参数,见CARGO_ENCODED_RUSTFLAGS。CARGO_ENCODED_RUSTFLAGS— 传给 Cargo 执行的所有编译器调用的自定义标志列表,以0x1f(ASCII 单元分隔符)分隔。CARGO_INCREMENTAL— 设为 1 时,Cargo 会强制为当前编译启用增量编译;设为 0 时强制禁用。若未设置此环境变量,则使用 cargo 的默认值。另见build.incremental配置项。CARGO_CACHE_RUSTC_INFO— 设为 0 时,Cargo 不会尝试缓存编译器版本信息。HTTPS_PROXY或https_proxy或http_proxy— 使用的 HTTP 代理,更多细节见http.proxy。HTTP_TIMEOUT— HTTP 超时(秒),更多细节见http.timeout。TERM— 设为dumb时禁用进度条。BROWSER— 使用cargo doc的--open标志打开文档时执行的 Web 浏览器,更多细节见doc.browser。RUSTFMT—cargo fmt将执行此指定的rustfmt实例,而不是运行rustfmt。
配置环境变量
Cargo 会读取部分配置值对应的环境变量。更多细节见配置章节。支持的环境变量汇总如下:
CARGO_ALIAS_<name>— 命令别名,见alias。CARGO_BUILD_JOBS— 并行任务数,见build.jobs。CARGO_BUILD_RUSTC—rustc可执行文件,见build.rustc。CARGO_BUILD_RUSTC_WRAPPER—rustc包装器,见build.rustc-wrapper。CARGO_BUILD_RUSTC_WORKSPACE_WRAPPER— 仅用于工作空间成员的rustc包装器,见build.rustc-workspace-wrapper。CARGO_BUILD_RUSTDOC—rustdoc可执行文件,见build.rustdoc。CARGO_BUILD_TARGET— 默认目标平台,见build.target。CARGO_BUILD_TARGET_DIR— 默认输出目录,见build.target-dir。CARGO_BUILD_BUILD_DIR— 默认构建目录,见build.build-dir。CARGO_BUILD_RUSTFLAGS— 额外的rustc标志,见build.rustflags。CARGO_BUILD_RUSTDOCFLAGS— 额外的rustdoc标志,见build.rustdocflags。CARGO_BUILD_INCREMENTAL— 增量编译,见build.incremental。CARGO_BUILD_DEP_INFO_BASEDIR— dep-info 相对目录,见build.dep-info-basedir。CARGO_CACHE_AUTO_CLEAN_FREQUENCY— 配置自动缓存清理的运行频率,见cache.auto-clean-frequency。CARGO_CARGO_NEW_VCS— 使用cargo new时的默认版本控制系统,见cargo-new.vcs。CARGO_FUTURE_INCOMPAT_REPORT_FREQUENCY— 未来不兼容报告通知的生成频率,见future-incompat-report.frequency。CARGO_HTTP_DEBUG— 启用 HTTP 调试,见http.debug。CARGO_HTTP_PROXY— 启用 HTTP 代理,见http.proxy。CARGO_HTTP_TIMEOUT— HTTP 超时,见http.timeout。CARGO_HTTP_CAINFO— TLS 证书颁发机构(CA)文件,见http.cainfo。CARGO_HTTP_PROXY_CAINFO— 代理 TLS 证书 CA 文件,见http.proxy-cainfo。CARGO_HTTP_CHECK_REVOKE— 禁用 TLS 证书吊销检查,见http.check-revoke。CARGO_HTTP_SSL_VERSION— 使用的 TLS 版本,见http.ssl-version。CARGO_HTTP_LOW_SPEED_LIMIT— HTTP 低速限制,见http.low-speed-limit。CARGO_HTTP_MULTIPLEXING— 是否使用 HTTP/2 多路复用,见http.multiplexing。CARGO_HTTP_USER_AGENT— HTTP User-Agent 头,见http.user-agent。CARGO_INSTALL_ROOT—cargo install的默认目录,见install.root。CARGO_NET_RETRY— 网络错误重试次数,见net.retry。CARGO_NET_GIT_FETCH_WITH_CLI— 启用使用git可执行文件进行 fetch,见net.git-fetch-with-cli。CARGO_NET_OFFLINE— 离线模式,见net.offline。CARGO_PROFILE_<name>_BUILD_OVERRIDE_<key>— 覆盖构建脚本配置文件,见profile.<name>.build-override。CARGO_PROFILE_<name>_CODEGEN_UNITS— 设置代码生成单元数,见profile.<name>.codegen-units。CARGO_PROFILE_<name>_DEBUG— 包含何种调试信息,见profile.<name>.debug。CARGO_PROFILE_<name>_DEBUG_ASSERTIONS— 启用/禁用调试断言,见profile.<name>.debug-assertions。CARGO_PROFILE_<name>_INCREMENTAL— 启用/禁用增量编译,见profile.<name>.incremental。CARGO_PROFILE_<name>_LTO— 链接时优化,见profile.<name>.lto。CARGO_PROFILE_<name>_OVERFLOW_CHECKS— 启用/禁用溢出检查,见profile.<name>.overflow-checks。CARGO_PROFILE_<name>_OPT_LEVEL— 设置优化级别,见profile.<name>.opt-level。CARGO_PROFILE_<name>_PANIC— 使用的 panic 策略,见profile.<name>.panic。CARGO_PROFILE_<name>_RPATH— rpath 链接选项,见profile.<name>.rpath。CARGO_PROFILE_<name>_SPLIT_DEBUGINFO— 控制调试文件输出行为,见profile.<name>.split-debuginfo。CARGO_PROFILE_<name>_STRIP— 控制符号和/或调试信息的剥离,见profile.<name>.strip。CARGO_REGISTRIES_<name>_CREDENTIAL_PROVIDER— registry 的凭证提供程序,见registries.<name>.credential-provider。CARGO_REGISTRIES_<name>_INDEX— registry 索引 URL,见registries.<name>.index。CARGO_REGISTRIES_<name>_TOKEN— registry 认证令牌,见registries.<name>.token。CARGO_REGISTRY_CREDENTIAL_PROVIDER— crates.io 的凭证提供程序,见registry.credential-provider。CARGO_REGISTRY_DEFAULT—--registry标志的默认 registry,见registry.default。CARGO_REGISTRY_GLOBAL_CREDENTIAL_PROVIDERS— 未定义特定提供程序的 registry 的全局凭证提供程序。见registry.global-credential-providers。CARGO_REGISTRY_TOKEN— crates.io 的认证令牌,见registry.token。CARGO_TARGET_<triple>_LINKER— 使用的链接器,见target.<triple>.linker。triple 必须转换为大写和下划线。CARGO_TARGET_<triple>_RUNNER— 可执行文件运行器,见target.<triple>.runner。CARGO_TARGET_<triple>_RUSTFLAGS— 针对某目标的额外rustc标志,见target.<triple>.rustflags。CARGO_TERM_QUIET— 安静模式,见term.quiet。CARGO_TERM_VERBOSE— 默认终端详细程度,见term.verbose。CARGO_TERM_COLOR— 默认颜色模式,见term.color。CARGO_TERM_PROGRESS_WHEN— 默认进度条显示模式,见term.progress.when。CARGO_TERM_PROGRESS_WIDTH— 默认进度条宽度,见term.progress.width。
Cargo 为 crate 设置的环境变量
Cargo 在编译 crate 时会向 crate 暴露这些环境变量。注意,使用 cargo run 和 cargo test 运行二进制文件时同样适用。要在 Rust 程序中获取这些变量中的任一值,可以这样做:
let version = env!("CARGO_PKG_VERSION");
此时 version 将包含 CARGO_PKG_VERSION 的值。
注意,若 manifest 中未提供某个值,对应的环境变量会被设为空字符串 ""。
CARGO— 执行构建的cargo二进制文件路径。CARGO_MANIFEST_DIR— 包含包 manifest 的目录。CARGO_MANIFEST_PATH— 包 manifest 的路径。CARGO_PKG_VERSION— 包的完整版本。CARGO_PKG_VERSION_MAJOR— 包的主版本号。CARGO_PKG_VERSION_MINOR— 包的次版本号。CARGO_PKG_VERSION_PATCH— 包的补丁版本号。CARGO_PKG_VERSION_PRE— 包的预发布版本。CARGO_PKG_AUTHORS— 包 manifest 中作者列表,以冒号分隔。CARGO_PKG_NAME— 包的名称。CARGO_PKG_DESCRIPTION— 包 manifest 中的描述。CARGO_PKG_HOMEPAGE— 包 manifest 中的主页。CARGO_PKG_REPOSITORY— 包 manifest 中的仓库。CARGO_PKG_LICENSE— 包 manifest 中的许可证。CARGO_PKG_LICENSE_FILE— 包 manifest 中的许可证文件。CARGO_PKG_RUST_VERSION— 包 manifest 中的 Rust 版本。注意,这是包支持的最低 Rust 版本,而非当前 Rust 版本。CARGO_PKG_README— 包 README 文件的路径。CARGO_CRATE_NAME— 当前正在编译的 crate 名称。它是 Cargo 目标 的名称,其中-转换为_,例如库、二进制、示例、集成测试或 benchmark 的名称。CARGO_BIN_NAME— 当前正在编译的二进制文件名称。仅对二进制文件或二进制示例设置。此名称不包含.exe等文件扩展名。OUT_DIR— 若包有构建脚本,则设为构建脚本应放置输出的文件夹。更多信息见下文。(仅在编译期间设置。)Cargo 不保证该目录为空,且构建之间不会清理。CARGO_BIN_EXE_<name>— 二进制目标可执行文件的绝对路径。仅在构建集成测试或 benchmark 时设置。可与env宏 配合使用,以查找用于测试的可执行文件。<name>为二进制目标的名称,原样使用。例如,名为my-program的二进制文件对应CARGO_BIN_EXE_my-program。除非二进制文件有未启用的必需特性,否则在构建测试时会自动构建二进制文件。CARGO_PRIMARY_PACKAGE— 若正在构建的包是主包(primary),则设置此环境变量。主包是用户在命令行上选择的包,通过-p标志或基于当前目录与默认工作空间成员的默认值。构建依赖时不会设置此变量,除非依赖同时也是在命令行上选择的工作空间成员。仅在编译包时设置(运行二进制文件或测试时不设置)。CARGO_TARGET_TMPDIR— 仅在构建集成测试或 benchmark 代码时设置。这是 target 目录内的路径,集成测试或 benchmark 可在此自由放置测试/bench 所需的任何数据。Cargo 会初始创建此目录,但不以任何方式管理其内容,由测试代码负责。
动态库路径
Cargo 在使用 cargo run、cargo test 等命令编译和运行二进制文件时,也会设置动态库路径。这有助于定位构建过程中涉及的共享库。变量名取决于平台:
- Windows:
PATH - macOS:
DYLD_FALLBACK_LIBRARY_PATH - Unix:
LD_LIBRARY_PATH - AIX:
LIBPATH
Cargo 启动时会从现有值扩展该值。macOS 有特殊处理:若尚未设置 DYLD_FALLBACK_LIBRARY_PATH,会添加默认的 $HOME/lib:/usr/local/lib:/usr/lib。
Cargo 包含以下路径:
- 通过
rustc-link-search指令从任何构建脚本包含的搜索路径。target目录外的路径会被移除。若系统上其他库需要在搜索路径中,运行 Cargo 的用户有责任正确设置环境。 - 基础输出目录(如
target/debug)及deps目录。这主要用于支持 proc-macro。 - rustc sysroot 库路径。对大多数用户通常不重要。
Cargo 为构建脚本设置的环境变量
Cargo 运行构建脚本时会设置若干环境变量。由于构建脚本编译时这些变量尚未设置,上述使用 env! 的示例无效,而需要在构建脚本运行时获取值:
use std::env;
let out_dir = env::var("OUT_DIR").unwrap();
此时 out_dir 将包含 OUT_DIR 的值。
CARGO— 执行构建的cargo二进制文件路径。CARGO_MANIFEST_DIR— 正在构建的包(包含构建脚本的包)的 manifest 所在目录。注意,这也是构建脚本启动时的当前工作目录。CARGO_MANIFEST_PATH— 包 manifest 的路径。CARGO_MANIFEST_LINKS— manifest 的links值。CARGO_MAKEFLAGS— 包含 Cargo jobserver 实现并行化子进程所需的参数。build.rs 中的 rustc 或 cargo 调用已可读取CARGO_MAKEFLAGS,但 GNU Make 要求标志直接作为参数或通过MAKEFLAGS环境变量指定。目前 Cargo 不设置MAKEFLAGS变量,但调用 GNU Make 的构建脚本可将其设为CARGO_MAKEFLAGS的内容。CARGO_FEATURE_<name>— 对于正在构建的包中每个已激活的特性,会存在此环境变量,其中<name>为特性名称的大写形式,且-转换为_。CARGO_CFG_<cfg>— 对于正在构建的包中每个配置选项,此环境变量包含配置的值,其中<cfg>为配置名称的大写形式,且-转换为_。布尔配置若已设置则存在,否则不存在。多值配置会合并为单个变量,值以,分隔。这包括编译器内置值(可通过rustc --print=cfg查看)以及构建脚本和传给rustc的额外标志(如RUSTFLAGS中定义的)设置的值。这些变量的一些示例如下:CARGO_CFG_FEATURE— 正在构建的包中每个已激活的特性。CARGO_CFG_UNIX— 在 类 Unix 平台 上设置。CARGO_CFG_WINDOWS— 在 类 Windows 平台 上设置。CARGO_CFG_TARGET_FAMILY=unix,wasm— 目标族。CARGO_CFG_TARGET_OS=macos— 目标操作系统。CARGO_CFG_TARGET_ARCH=x86_64— CPU 目标架构。CARGO_CFG_TARGET_VENDOR=apple— 目标厂商。CARGO_CFG_TARGET_ENV=gnu— 目标环境 ABI。CARGO_CFG_TARGET_ABI=eabihf— 目标 ABI。CARGO_CFG_TARGET_POINTER_WIDTH=64— CPU 指针宽度。CARGO_CFG_TARGET_ENDIAN=little— CPU 目标字节序。CARGO_CFG_TARGET_FEATURE=mmx,sse— 已启用的 CPU 目标特性 列表。
注意,不同目标 triple 有不同的
cfg值集合,因此一个目标 triple 中存在的变量在另一个中可能不可用。某些 cfg 值(如
test)不可用。提示: 若要类型化 API 读取这些值,考虑使用
build-rscrate,而不是手动解析环境变量。另请注意,构建脚本中应使用CARGO_CFG_*变量,而不是cfg!宏或#[cfg]属性,后者检查的是主机平台,而非目标平台。OUT_DIR— 应放置所有输出和中间产物的文件夹。此文件夹位于正在构建的包的构建目录内,且对该包唯一。Cargo 在构建之间不会清理或重置此目录,其内容可能在重建之间保留。构建脚本不应假设OUT_DIR为空,并负责管理或清理其创建的文件。TARGET— 正在编译的目标 triple。原生代码应为此 triple 编译。更多信息见目标 Triple 说明。HOST— Rust 编译器的主机 triple。NUM_JOBS— 顶层并行度。可用于向make等系统传递-j参数。注意解读此环境变量时应谨慎。出于历史原因仍会提供,但较新版本的 Cargo 例如不需要运行make -j,而可将MAKEFLAGS环境变量设为CARGO_MAKEFLAGS的内容,以在子 make 调用中启用 Cargo 的 GNU Make 兼容 jobserver。DEBUG— 若将生成任何debug信息则为true,否则为false。OPT_LEVEL— 当前正在构建的配置文件对应的opt-level变量值。PROFILE— release 构建为release,其他构建为debug。这基于配置文件是否继承自dev或release配置文件。不推荐使用此环境变量。使用OPT_LEVEL等其他环境变量能更准确地反映实际使用的设置。DEP_<links>_<key>— 关于这组环境变量的更多信息,见构建脚本文档中的links。RUSTC、RUSTDOC— Cargo 解析使用的编译器和文档生成器,传给构建脚本以便其同样使用。RUSTC_WRAPPER— Cargo 使用的rustc包装器(若有)。见build.rustc-wrapper。RUSTC_WORKSPACE_WRAPPER— Cargo 对工作空间成员使用的rustc包装器(若有)。见build.rustc-workspace-wrapper。RUSTC_LINKER— Cargo 为当前目标解析使用的链接器二进制文件路径(若已指定)。链接器可通过编辑.cargo/config.toml更改;更多信息见 cargo 配置 文档。CARGO_ENCODED_RUSTFLAGS— Cargo 调用rustc时使用的额外标志,以0x1f字符(ASCII 单元分隔符)分隔。见build.rustflags。注意,自 Rust 1.55 起,RUSTFLAGS会从环境中移除;脚本应改用CARGO_ENCODED_RUSTFLAGS。CARGO_PKG_<var>— 包信息变量,名称和值与 crate 构建期间提供的变量 相同。
Cargo 为 cargo test 设置的环境变量
Cargo 运行测试时会设置若干环境变量。可在测试运行时获取值:
use std::env;
let out_dir = env::var("CARGO_BIN_EXE_foo").unwrap();
CARGO_BIN_EXE_<name>— 二进制目标可执行文件的绝对路径。仅在运行集成测试或 benchmark 时设置。<name>为二进制目标的名称,原样使用。例如,名为my-program的二进制文件对应CARGO_BIN_EXE_my-program。除非二进制文件有未启用的必需特性,否则在构建测试时会自动构建二进制文件。
Cargo 为第三方子命令设置的环境变量
Cargo 向第三方子命令(即放在 $PATH 中、名为 cargo-foobar 的程序)暴露此环境变量:
CARGO— 执行构建的cargo二进制文件路径。CARGO_MAKEFLAGS— 包含 Cargo jobserver 实现并行化子进程所需的参数。仅在 Cargo 检测到 jobserver 存在时设置。
有关环境的扩展信息,可运行 cargo metadata。