环境变量
Cargo设置和读取一些环境变量,你的代码可以检测或覆盖这些变量。 下面是Cargo设置的变量列表,按照与之交互的时间次序排列:
Cargo读取环境变量
你可以覆盖这些环境变量在系统中改变Cargo的行为:
CARGO_LOG- Cargo 使用env_loggercrate 来显示调试日志信息。CARGO_LOG环境变量可以设置为启用调试日志,其值为trace、debug或warn。 通常,其只在调试时使用。更多细节请参考Debug logging。CARGO_HOME— Cargo 维护着注册中心索引和git签出crate的本地缓存。 默认情况下,这些数据存储在$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通过配置来设置。 将其设置为空字符串会覆盖配置,并将crate重置为不使用包装器。RUSTC_WORKSPACE_WRAPPER— 对于工作空间成员,Cargo将执行这个指定的包装器,而不是简单地运行rustc,将rustc的调用作为其命令行参数,第一个参数是实际rustc的路径。 它影响文件名hash,以便单独缓存包装器产生制品。参见build.rustc-workspace-wrapper通过配置来设置。 将其设置为空字符串会覆盖配置,并将crate重置为不对工作空间成员使用包装器。RUSTDOC— Cargo将执行这个指定的rustdoc实例,而不是运行rustdoc。见build.rustdoc通过配置来设置。RUSTDOCFLAGS— 以空格分隔的自定义标志列表,用于传递给Cargo执行的所有rustdoc调用。 与cargo rustdoc不同的是,这对于向 所有rustdoc实例传递标志很有用。 参见build.rustdocflags以了解更多设置标志的方法。这个字符串用空格分割;如果要对多个参数进行更健壮的编码,请参见CARGO_ENCODED_RUSTDOCFLAGS。CARGO_ENCODED_RUSTDOCFLAGS- 用0x1f(ASCII单位分隔符)分隔的自定义标志列表,用于传递给Cargo执行的所有rustdoc调用。RUSTFLAGS— 以空格分隔的自定义标志列表,用于传递给Cargo执行的所有编译器调用。 与cargo rustc不同的是,这对于向 所有 编译器实例传递标志很有用。 参见build.rustflags以了解更多设置标志的方法。这个字符串是由空格分割;如果要对多个参数进行更健壮的编码,见CARGO_ENCODED_RUSTFLAGS。CARGO_ENCODED_RUSTFLAGS- 用0x1f(ASCII单元分隔符) 分隔的自定义标志列表,用于传递给Cargo执行的所有编译器调用。CARGO_INCREMENTAL— 如果设置为1,那么Cargo将强制在当前编译中启用incremental compilation ,设置为0时, 将强制禁用增量编译。如果这个环境变量不存在,那么将使用cargo的默认值。另请参见build.incremental配置值。CARGO_CACHE_RUSTC_INFO— 如果这个设置为0,那么Cargo将不会尝试缓存编译器版本信息。HTTPS_PROXYorhttps_proxyorhttp_proxy— 要使用的HTTP代理,更多细节见http.proxy。HTTP_TIMEOUT— HTTP超时,以秒为单位,详见http.timeout。TERM— 如果这个设置为dumb,将禁用进度条。BROWSER— 用cargo doc的--open标志打开文档时要执行的网络浏览器,更多细节见doc.browser。RUSTFMT— 代替rustfmt,cargo fmt将执行这个指定的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_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_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证书机构文件, 见http.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— 要使用的恐慌策略, 见profile.<name>.panic.CARGO_PROFILE_<name>_RPATH— rpath链接选项, 见profile.<name>.rpath.CARGO_PROFILE_<name>_SPLIT_DEBUGINFO— 控制调试文件的输出行为, 见profile.<name>.split-debuginfo.CARGO_REGISTRIES_<name>_INDEX— 注册中心索引的URL, 见registries.<name>.index.CARGO_REGISTRIES_<name>_TOKEN— 注册中心认证token, 见registries.<name>.token.CARGO_REGISTRY_DEFAULT—--registry的默认注册中心。见registry.default。CARGO_REGISTRY_TOKEN— crates.io 的认证token。 见registry.token。CARGO_TARGET_<triple>_LINKER— 使用的链接器, 见target.<triple>.linker。 三元组必须是 转换为大写字母和下划线 。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 的值。
请注意,如果配置清单中没有提供这些值之一,则相应的环境变量将被设置为空字符串 "" 。
CARGO— 执行构建的cargo二进制文件的路径。CARGO_MANIFEST_DIR— 包含你的包配置清单的目录。CARGO_PKG_VERSION— 你的包的完整版本。CARGO_PKG_VERSION_MAJOR— 你的包的主要版本。CARGO_PKG_VERSION_MINOR— 你的包的次要版本。CARGO_PKG_VERSION_PATCH— 你的包的补丁版本。CARGO_PKG_VERSION_PRE— 你的包的预发布版本。CARGO_PKG_AUTHORS— 冒号分隔的作者名单,来自你的包的配置清单。CARGO_PKG_NAME— 你的包的名称。CARGO_PKG_DESCRIPTION— 你的包配置清单的描述。CARGO_PKG_HOMEPAGE— 你的包的配置清单中的主页。CARGO_PKG_REPOSITORY— 你的包配置清单中的存储库。CARGO_PKG_LICENSE— 你的包的配置清单中的许可证。CARGO_PKG_LICENSE_FILE— 你的包的配置清单中的许可证文件。CARGO_PKG_RUST_VERSION— 你的包的配置清单中的Rust版本。 注意,这是包支持的最小Rust版本,而不是当前的Rust版本。CARGO_CRATE_NAME— 当前正在编译的crate的名称。CARGO_BIN_NAME— 当前正在编译的二进制文件的名称(如果它是一个二进制文件)。这个名字不包括任何文件扩展名,如.exe。OUT_DIR— 如果该包有构建脚本,这将被设置为构建脚本应该放置其输出的文件夹。更多信息见下文。(只在编译过程中设置)。CARGO_BIN_EXE_<name>— 二进制目标的可执行文件的绝对路径。这只在构建集成测试或性能测试时设置。这可以与envmacro一起使用,以找到为测试目的运行的可执行文件。<name>是二进制目标的名称,完全按原样。例如,CARGO_BIN_EXE_my-program代表一个名为my-program的二进制文件。当测试建立时,二进制文件会自动建立,除非二进制文件有未启用的必要特性。CARGO_PRIMARY_PACKAGE— 如果正在构建的包是主要的,这个环境变量将被设置。主要包是用户在命令行中选择的,可以是-p标志,也可以是基于当前目录和默认工作空间成员的默认值。这个环境变量在构建依赖时不会被设置。只有在编译包时才会设置 (而不是在运行二进制文件或测试时) 。CARGO_TARGET_TMPDIR— 只在构建集成测试或性能测试代码时设置。这是一个指向目标目录内的路径,集成测试或性能测试可以在这里自由放置测试/性能测试所需的任何数据。Cargo初始创建这个目录,但不以任何方式管理其内容,这是测试代码的责任。
动态库路径
在使用 cargo run 和 cargo test 等命令编译和运行二进制文件时,Cargo也会设置动态库路径。这有助于定位作为构建过程一部分的共享库。变量名称取决于平台:
- Windows:
PATH - macOS:
DYLD_FALLBACK_LIBRARY_PATH - Unix:
LD_LIBRARY_PATH
macOS有特殊的考虑,如果 DYLD_FALLBACK_LIBRARY_PATH 还没有设置,它就会增加默认的 $HOME/lib:/usr/local/lib:/usr/lib 。
Cargo包括以下路径:
- 搜索任何带有
rustc-link-searchinstruction的构建脚本中包含的路径。target目录之外的路径会被删除。如果在搜索路径中需要额外的系统库,运行Cargo的用户有责任正确设置环境。 - 基本输出目录,如
target/debug,和 "deps" 目录。这主要是为了对rustc编译器插件的遗留支持。 - 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_LINKS— 配置清单links值。CARGO_MAKEFLAGS— 包含Cargo的jobserver实现所需的参数,以使子进程并行化。Rustc或build.rs中的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_UNIX— 在 unix-like platforms 设置。CARGO_CFG_WINDOWS— 在 windows-like platforms 设置。CARGO_CFG_TARGET_FAMILY=unix— target family 。CARGO_CFG_TARGET_OS=macos— target operating system 。CARGO_CFG_TARGET_ARCH=x86_64— CPU target architecture 。CARGO_CFG_TARGET_VENDOR=apple— target vendor 。CARGO_CFG_TARGET_ENV=gnu— target environment ABI 。CARGO_CFG_TARGET_POINTER_WIDTH=64— CPU pointer width 。CARGO_CFG_TARGET_ENDIAN=little— CPU target endianness 。CARGO_CFG_TARGET_FEATURE=mmx,sse— 启用的CPUtarget features 列表。
OUT_DIR— 所有输出和中间制品应该放在哪个文件夹里。这个文件夹位于正在构建的包的构建目录内,而且对相关的包来说是唯一的。TARGET— 正在被编译的目标三元组。本地代码应该为这个三元组进行编译。更多信息请参见 Target Triple 的描述。HOST— 是Rust编译器的主机三元组。NUM_JOBS— 被指定为顶层的并行性。这对于向make这样的系统传递-j参数很有用。注意,在解释这个环境变量的时候要注意。 出于历史原因,仍然提供了这个变量,但最近的Cargo版本,例如,不需要运行make -j,而是可以将MAKEFLAGS环境变量设置为CARGO_MAKEFLAGS的内容,以激活使用Cargo的GNU Make兼容 jobserver 进行子make调用。OPT_LEVEL,DEBUG— 目前正在建立的配置文件的相应变量的值。PROFILE—release用于发布版本,debug用于其他版本。这是根据 profile 是否继承自dev或release配置文件来决定的。不建议使用这个环境变量。使用其他环境变量,如OPT_LEVEL,可以更准确地了解正在使用的实际设置。DEP_<name>_<key>— 关于这组环境变量的更多信息,请参见关于links的构建脚本文档。RUSTC,RUSTDOC— 是Cargo决定使用的编译器和文档生成器,传递给构建脚本,以便它也能使用。RUSTC_WRAPPER— Cargo使用的rustc包装器,如果有的话。 见build.rustc-wrapper.RUSTC_WORKSPACE_WRAPPER—rustc包装器,如果有的话,Cargo对工作空间成员使用。 见build.rustc-workspace-wrapper.RUSTC_LINKER— 如果指定了链接器,则是Cargo已经决定为当前目标使用的链接器二进制文件的路径。链接器可以通过编辑.cargo/config.toml来改变;更多信息请参见 cargo configuration 文档。CARGO_ENCODED_RUSTFLAGS— 附加的标志,Cargo调用rustc时,用0x1f字符(ASCII单位分隔符)分隔。见build.rustflags。注意,从Rust 1.55开始,RUSTFLAGS已经从环境中移除;脚本应该使用CARGO_ENCODED_RUSTFLAGS代替。CARGO_PKG_<var>- 包的信息变量,其名称和数值与在crate构建过程中提供的相同。
环境变量 Cargo 为第三方子命令设置的环境变量
Cargo将这个环境变量暴露给第三方子命令(即放在 $PATH 中的名为 cargo-foobar 的程序):
CARGO— 执行构建的cargo二进制文件的路径。
对于你的环境的扩展信息,可以运行 cargo metadata 。