第20章 Cargo 环境变量详解
Cargo 会设置并读取一系列环境变量,你的代码可以检测或覆盖它们。以下是 Cargo 设置的环境变量列表,按其与变量交互的时机分类:
Cargo 读取的环境变量
你可以覆盖这些环境变量来改变 Cargo 在系统中的行为:
CARGO_LOG— Cargo 使用tracingcrate 来显示调试日志消息。CARGO_LOG环境变量可用于启用调试日志,取值可以是trace、debug或warn。通常仅在调试时使用。更多详情请参考调试日志。CARGO_HOME— Cargo 维护注册表索引和 crates git 签出的本地缓存。默认情况下,这些内容存储在$HOME/.cargo目录下(在 Windows 上为%USERPROFILE%\.cargo),但此变量可以覆盖该目录的位置。一旦某个 crate 被缓存,clean 命令不会将其移除。更多详情请参考指南。CARGO_TARGET_DIR— 存放所有生成产物的位置,相对于当前工作目录。关于通过配置设置的说明,请参阅build.target-dir。CARGO— 如果设置了该变量,Cargo 在构建 crates、执行构建脚本和外部子命令时,将转发此值,而不是设置其自动检测到的路径。该值不会被 Cargo 直接执行,且应始终指向一个行为与cargo完全一致的命令,因为使用该变量的用户会这样期望。RUSTC— 不再运行rustc,而是执行指定的编译器。关于通过配置设置的说明,请参阅build.rustc。
RUSTC_WRAPPER — 不再直接运行 rustc,而是执行指定的 wrapper 程序。Cargo 会将 rustc 的完整调用作为命令行参数传入,其中第一个参数是实际 rustc 可执行文件的路径。该变量常用于配置 sccache 等构建缓存工具。可通过配置项 build.rustc-wrapper 进行设置。若将其设为空字符串,将覆盖配置文件中的设置,使 Cargo 停止使用 wrapper。RUSTC_WORKSPACE_WRAPPER — 针对工作区成员,Cargo 不再直接运行 rustc,而是执行指定的 workspace wrapper 程序。同样,它将 rustc 的完整调用作为命令行参数传入,第一个参数为实际 rustc 可执行文件的路径。若构建的是不含工作区的单包项目,该项目即被视为工作区。此设置会影响文件名哈希,从而使 wrapper 生成的产物独立缓存。可通过配置项 build.rustc-workspace-wrapper 进行设置。若将其设为空字符串,将覆盖配置文件中的设置,使 Cargo 停止对 工作区 成员使用 wrapper。若同时设置了 RUSTC_WRAPPER 和 RUSTC_WORKSPACE_WRAPPER,它们将被嵌套使用:最终的调用形式为 $RUSTC_WRAPPER $RUSTC_WORKSPACE_WRAPPER $RUSTC。RUSTDOC — 不再直接运行默认的 rustdoc,而是执行指定的该变量所指向的 rustdoc 实例。可通过配置项 build.rustdoc 进行设置。RUSTDOCFLAGS — 以空格分隔的自定义标志列表,用于传递给 Cargo 执行的所有 rustdoc 调用。与 cargo rustdoc 相比,该变量更适合向 所有 rustdoc 实例传递标志。关于更多设置标志的方式,请参见 build.rustdocflags。该字符串按空白字符分割;如需更稳健地编码多个参数,请参见 CARGO_ENCODED_RUSTDOCFLAGS。CARGO_ENCODED_RUSTDOCFLAGS — 由 0x1f(ASCII Unit Separator,单元分隔符)分隔的自定义标志列表,用于传递给 Cargo 执行的所有 rustdoc 调用。RUSTFLAGS — 以空格分隔的自定义 flags 列表,Cargo 会把它传给所有编译器调用。与 cargo rustc 不同,这个变量可以把 flag 传给所有编译器实例。设置 flag 的其他方式可参考 build.rustflags。该字符串按空白字符拆分;如需更可靠地传递多个参数,请使用 CARGO_ENCODED_RUSTFLAGS。CARGO_ENCODED_RUSTFLAGS — 以 0x1f(ASCII 单元分隔符)分隔的自定义 flags 列表,Cargo 会把它传给所有编译器调用。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 参数打开文档的浏览器,详见 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— 依赖信息相对目录,详见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可执行文件进行拉取,参见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.default。CARGO_REGISTRY_GLOBAL_CREDENTIAL_PROVIDERS— 用于未定义特定凭证提供者的注册表的凭证提供者。参见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 暴露这些环境变量。
注意,使用 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 目标 名称中的-转换为_后的结果,例如库、二进制文件、示例、集成测试或基准测试的名称。CARGO_BIN_NAME— 当前正在编译的二进制文件名称。 仅对 二进制文件或二进制示例有效。该名称不包含任何文件扩展名(如.exe)。OUT_DIR— 如果该包有构建脚本,此变量指向构建脚本存放输出文件的目录。详见下文。(仅在编译时设置。)Cargo 不保证该目录为空,也不会在构建之间清理它。CARGO_BIN_EXE_<name>— 二进制目标可执行文件的绝对路径。仅在构建集成测试或基准测试时设置。可以配合env宏找到需要运行的可执行文件用于测试。<name>是二进制目标的名称,原样保留。例如,名为my-program的二进制对应CARGO_BIN_EXE_my-program。构建测试时会自动构建这些二进制,除非它们依赖未启用的 feature。CARGO_PRIMARY_PACKAGE— 当被构建的包是“主包”时设置此变量。主包指用户在命令行上选择的包(通过-p参数,或基于当前目录和默认 workspace 成员的默认值)。构建依赖时不会设置该变量,除非该依赖同时也是命令行中选中的 workspace 成员。此变量仅在编译包时设置(运行二进制或测试时不设置)。CARGO_TARGET_TMPDIR— 仅在构建集成测试或基准测试代码时设置。它指向 target 目录下的一个子目录,集成测试和基准测试可以自由地把测试所需的数据放在这里。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-macros。 - 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— 包含当前构建包清单文件的目录(即包含该构建脚本的包)。注意,这也是构建脚本启动时的工作目录。CARGO_MANIFEST_PATH— 包清单文件的路径。CARGO_MANIFEST_LINKS— 清单中links字段的值。CARGO_MAKEFLAGS— 包含用于 Cargo jobserver 实现并行化子进程所需的参数。build.rs 中调用的 rustc 或 cargo 已能读取CARGO_MAKEFLAGS,但 GNU Make 要求通过直接传参或设置MAKEFLAGS环境变量来指定这些标志。目前 Cargo 不会设置MAKEFLAGS变量,但调用 GNU Make 的构建脚本可以自由将其设为CARGO_MAKEFLAGS的内容。CARGO_FEATURE_<name>— 对于正在构建的包中每个启用的 feature,若<name>是该 feature 名称的大写形式且将-替换为_,则对应环境变量存在。CARGO_CFG_<cfg>— 对于正在构建的包中每个配置项,该环境变量包含对应配置的值,其中<cfg>是配置名称的大写形式且将-替换为_。布尔型配置项在设置时存在,否则不存在。多值配置项通过,分隔合并到单个变量中。这包括编译器内置的值(可通过rustc --print=cfg查看),以及由构建脚本和传递给rustc的额外标志(如RUSTFLAGS中定义的值)设置的值。这些变量的一些示例如下:CARGO_CFG_FEATURE— 正在构建的包中每个启用的 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 目标特性列表。
注意,不同的目标三元组(target triple)对应不同的
cfg值集合,某个目标三元组中存在的变量,在另一个中可能并不存在。类似
test这样的 cfg 值是不可用的。提示:如果想用类型安全的方式读取这些值,可以考虑使用
build-rscrate,而不是手动解析环境变量。另外请注意,在构建脚本中应使用CARGO_CFG_*变量,而不是cfg!宏或#[cfg]属性——后者检查的是 host 平台,而不是 target。OUT_DIR— 存放所有输出产物和中间产物的目录。该目录位于被构建包的构建目录内,且对每个包是唯一的。Cargo 在多次构建之间不会清理或重置这个目录,其内容可能会在重新构建时保留下来。构建脚本不应假设OUT_DIR是空的,需要自行负责管理或清理自己创建的文件。TARGET—— 目标三元组。原生代码应针对此三元组编译。有关更多详细信息,请参阅目标三元组中的说明。HOST—— Rust 编译器的宿主三元组。NUM_JOBS—— 顶层并行度指定的并行数量。这对于向类似make的系统传递-j参数非常有用。注意在解释此环境变量时应谨慎。出于历史原因,我们仍然提供它,但 Cargo 的近期版本不再需要运行make -j,而是可以将MAKEFLAGS环境变量设置为CARGO_MAKEFLAGS的内容,以启用 Cargo 的 GNU Make 兼容的jobserver 用于子 make 调用。DEBUG—— 如果将生成任何debug信息,则为true,否则为false。OPT_LEVEL—— 当前正在构建的 profile 对应的opt-level变量的值。PROFILE—— 对于发布构建为release,其他构建为debug。这是基于 profile 是否继承自dev或releaseprofile 来确定的。不建议使用此环境变量。使用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/config.tom可以更改链接器;有关更多详情,请参阅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>— 二进制目标可执行文件的绝对路径。 仅在运行集成测试或基准测试时设置。<name>即二进制目标的名称,保持原样。例如,名为my-program的二进制对应CARGO_BIN_EXE_my-program。 构建测试时会自动构建二进制文件,除非该二进制依赖的特性未被启用。
Cargo 为第三方子命令设置的环境变量
Cargo 为第三方子命令(即放置在 $PATH 中、命名为 cargo-foobar 的程序)暴露此环境变量:
CARGO— 执行构建的cargo二进制文件的路径。CARGO_MAKEFLAGS— 包含用于 Cargo jobserver 实现的并行化子进程所需的参数。 仅当 Cargo 检测到 jobserver 存在时才会设置此变量。
如需了解环境的更多详细信息,可以运行 cargo metadata。