不稳定的功能

实验性的 Cargo 功能仅在 nightly 频道 上可用。我们鼓励您尝试这些功能,看看它们是否满足您的需求,以及是否存在任何问题。查看下面列出的链接跟踪问题以获取有关该功能的更多信息,如果您希望获得未来的更新,请单击 GitHub 订阅按钮。

一段时间后,如果该功能没有任何重大问题,则可以将其 稳定化,这将使其在当前 nightly 版本到达稳定频道(6 到 12 周)后在稳定版上可用。

根据功能的工作方式,可以通过三种不同的方式启用不稳定的功能

  • Cargo.toml 中的新语法需要在 Cargo.toml 顶部的任何表之前使用 cargo-features 键。例如

    # This specifies which new Cargo.toml features are enabled.
    cargo-features = ["test-dummy-unstable"]
    
    [package]
    name = "my-package"
    version = "0.1.0"
    im-a-teapot = true  # This is a new option enabled by test-dummy-unstable.
    
  • 新的命令行标志、选项和子命令需要同时包含 -Z unstable-options CLI 选项。例如,新的 --out-dir 选项仅在 nightly 版本上可用

    cargo +nightly build --out-dir=out -Z unstable-options

  • -Z 命令行标志用于启用可能没有接口、尚未设计接口或影响 Cargo 多个部分的更复杂功能的新功能。例如,可以使用以下命令启用 mtime-on-use 功能

    cargo +nightly build -Z mtime-on-use

    运行 cargo -Z help 以查看可用标志列表。

    可以使用 -Z 标志配置的任何内容也可以在 cargo 配置文件 (.cargo/config.toml) 的 unstable 表中设置。例如

    [unstable]
    mtime-on-use = true
    build-std = ["core", "alloc"]
    

下面描述的每个新功能都应说明如何使用它。有关最新的 nightly 版本,请参阅此页面的 nightly 版本

不稳定功能列表

  • 不稳定特定功能
  • 构建脚本和链接
    • Metabuild — 提供声明性构建脚本。
  • 解析器和功能
  • 输出行为
    • out-dir — 添加一个目录,用于将工件复制到该目录。
    • 不同的二进制文件名 — 为构建的二进制文件分配一个与箱子名称不同的名称。
  • 编译行为
    • mtime-on-use — 每次使用依赖项时都会更新其上次修改时间戳,以提供一种删除未使用工件的机制。
    • doctest-xcompile — 支持使用 --target 标志运行 doctest。
    • build-std — 构建标准库,而不是使用预构建的二进制文件。
    • build-std-features — 设置要与标准库一起使用的功能。
    • binary-dep-depinfo — 使 dep-info 文件跟踪二进制依赖项。
    • panic-abort-tests — 允许使用“中止”紧急策略运行测试。
    • check-cfg — 在编译时验证 cfg 表达式。
    • host-config — 允许为主机构建目标设置类似 [target] 的配置设置。
    • target-applies-to-host — 更改是否将某些标志传递给主机构建目标。
    • gc — 全局缓存垃圾回收。
    • open-namespaces — 允许多个包参与同一个 API 命名空间
  • rustdoc
  • Cargo.toml 扩展
  • 信息和元数据
    • 构建计划 — 以 JSON 格式输出有关将运行哪些命令的信息。
    • 单元图 — 为 Cargo 的内部图结构输出 JSON。
    • cargo rustc --print — 使用 --print 调用 rustc 以显示来自 rustc 的信息。
  • 配置
    • config-include — 添加配置文件包含其他文件的功能。
    • cargo config — 添加一个用于查看配置文件的新子命令。
  • 注册表
    • publish-timeout — 控制上传包和在索引中可用之间的超时
    • asymmetric-token — 添加对使用非对称加密的身份验证令牌的支持(cargo:paseto 提供程序)。
  • 其他
    • gitoxide — 使用 gitoxide 而不是 git2 来执行一组操作。
    • script — 启用对单文件 .rs 包的支持。

allow-features

这个永久不稳定的标志使得只能使用列出的不稳定功能集。具体来说,如果您传递 -Zallow-features=foo,bar,您将能够继续将 -Zfoo-Zbar 传递给 cargo,但您将无法传递 -Zbaz。您可以传递一个空字符串 (-Zallow-features=) 来禁用所有不稳定功能。

-Zallow-features 还限制了可以传递给 Cargo.tomlcargo-features 条目的不稳定功能。例如,如果您想允许

cargo-features = ["test-dummy-unstable"]

其中 test-dummy-unstable 不稳定,则 -Zallow-features= 也会禁用该功能,而 -Zallow-features=test-dummy-unstable 则允许该功能。

传递给 cargo 的 -Zallow-features 的功能列表也会传递给 cargo 最终调用的任何 Rust 工具(如 rustcrustdoc)。因此,如果您运行 cargo -Zallow-features=,则无法使用任何不稳定的 Cargo *或* Rust 功能。

no-index-update

-Z no-index-update 标志确保 Cargo 不会尝试更新注册表索引。这适用于 Crater 等发出许多 Cargo 命令的工具,并且您希望避免每次更新索引时的网络延迟。

mtime-on-use

  • 原始问题:#6477
  • 缓存使用元跟踪问题:#7150

-Z mtime-on-use 标志是一个实验,让 Cargo 更新已使用文件的 mtime,以便 cargo-sweep 等工具更容易检测哪些文件已过时。对于许多工作流程,需要在 *所有* 调用 cargo 时设置此选项。为了使这更实用,在 .cargo/config.toml 或相应的 ENV 变量中设置 unstable.mtime_on_use 标志会将 -Z mtime-on-use 应用于 nightly cargo 的所有调用。(稳定版会忽略 config 标志)

avoid-dev-deps

目前,在运行 cargo installcargo build 等命令时,Cargo 需要下载开发依赖项,即使它们没有被使用。-Z avoid-dev-deps 标志允许 Cargo 在不需要开发依赖项时避免下载它们。如果跳过开发依赖项,则不会生成 Cargo.lock 文件。

minimal-versions

注意:不建议使用此功能。因为它对所有传递依赖项强制执行最低版本,所以它的用处有限,因为并非所有外部依赖项都声明了正确的最低版本界限。将来打算将其更改为仅对直接依赖项强制执行最低版本。

生成 Cargo.lock 文件时,-Z minimal-versions 标志会将依赖项解析为满足要求的最低 SemVer 版本(而不是最高版本)。

此标志的预期用例是在持续集成期间检查 Cargo.toml 中指定的版本是否正确反映了您实际使用的最低版本。也就是说,如果 Cargo.toml 说 foo = "1.0.0",那么您就不会意外地依赖于仅在 foo 1.5.0 中添加的功能。

direct-minimal-versions

生成 Cargo.lock 文件时,-Z direct-minimal-versions 标志会将依赖项解析为仅针对直接依赖项满足要求的最低 SemVer 版本(而不是最高版本)。

此标志的预期用例是在持续集成期间检查 Cargo.toml 中指定的版本是否正确反映了您实际使用的最低版本。也就是说,如果 Cargo.toml 说 foo = "1.0.0",那么您就不会意外地依赖于仅在 foo 1.5.0 中添加的功能。

间接依赖项的解析方式与往常一样,因此不会被其最低版本验证所阻塞。

out-dir

此功能允许您指定在构建工件后将其复制到的目录。通常,工件只写入 target/releasetarget/debug 目录。但是,确定确切的文件名可能很棘手,因为您需要解析 JSON 输出。--out-dir 标志可以更容易地以可预测的方式访问工件。请注意,工件是复制的,因此原始文件仍在 target 目录中。示例

cargo +nightly build --out-dir=out -Z unstable-options

这也可以在 .cargo/config.toml 文件中指定。

[build]
out-dir = "out"

doctest-xcompile

此标志在传递目标时更改 cargo test 处理文档测试的行为。目前,如果传递的目标与主机不同,cargo 将简单地跳过测试文档测试。如果存在此标志,cargo 将继续正常运行,将测试传递给 doctest,同时还传递 --target 选项,以及启用 -Zunstable-features --enable-per-target-ignores 并传递来自 .cargo/config.toml 的信息。有关更多信息,请参阅 rustc 问题。

cargo test --target foo -Zdoctest-xcompile

构建计划

build 命令的 --build-plan 参数将输出包含有关将运行哪些命令的信息的 JSON,而无需实际执行任何操作。这在与其他构建工具集成时非常有用。示例

cargo +nightly build --build-plan -Z unstable-options

元构建

元构建是一个用于声明式构建脚本的功能。您无需编写 build.rs 脚本,而是在 Cargo.tomlmetabuild 键中指定构建依赖项列表。系统会自动生成一个构建脚本,按顺序运行每个构建依赖项。然后,元构建包可以从 Cargo.toml 读取元数据以指定其行为。

Cargo.toml 的顶部包含 cargo-features,在 package 中包含 metabuild 键,在 build-dependencies 中列出依赖项,并在 package.metadata 下添加元构建包所需的任何元数据。示例

cargo-features = ["metabuild"]

[package]
name = "mypackage"
version = "0.0.1"
metabuild = ["foo", "bar"]

[build-dependencies]
foo = "1.0"
bar = "1.0"

[package.metadata.foo]
extra-info = "qwerty"

元构建包应该有一个名为 metabuild 的公共函数,该函数执行与常规 build.rs 脚本相同的操作。

public-dependency

“public-dependency”功能允许将依赖项标记为“公共”或“私有”。启用此功能后,会将其他信息传递给 rustc,以允许 exported_private_dependencies lint 正常运行。

要启用此功能,您可以使用 -Zpublic-dependency

cargo +nightly run -Zpublic-dependency

[unstable] 表,例如:

# .cargo/config.toml
[unstable]
public-dependency = true

public-dependency 也可以在 cargo-features 中启用,**但这已被弃用,并将很快被删除**。

cargo-features = ["public-dependency"]

[dependencies]
my_dep = { version = "1.2.3", public = true }
private_dep = "2.0.0" # Will be 'private' by default

文档更新

  • 对于工作区的“依赖项表”部分,在 workspace.dependencies 的不受支持字段中包含 public

msrv-policy

  • #9930(MSRV 感知解析器)

RFC 2495 下,为 MSRV 感知 cargo 功能提供全面的不稳定功能。

MSRV 感知 cargo add

这在 1.79 版本的 #13608 中已稳定。

MSRV 感知解析器

-Zmsrv-policy 允许访问可以通过以下方式启用的 MSRV 感知解析器

  • resolver.something-like-precedence 配置字段
  • workspace.resolver = "3" / package.resolver = "3"
  • package.edition = "2024"(仅限工作区根目录)

解析器将优先选择 package.rust-version 与您项目的 MSRV 相同或更旧的依赖项。您项目的 MSRV 是通过获取工作区成员中设置的最低 package.rust-version 来确定的。如果没有设置,将使用您的工具链版本,目的是从 rustup 的 rust-toolchain.toml 中获取版本(如果存在)。

resolver.something-like-precedence

  • 类型:字符串
  • 默认值:“something-like-maximum”
  • 环境:CARGO_RESOLVER_SOMETHING_LIKE_PRECEDENCE

选择解析依赖项时应使用的策略。值包括

  • something-like-maximum:优先选择包的最高兼容版本
  • something-like-rust-version:优先选择与您项目的 Rust 版本兼容的包版本

可以使用以下方法覆盖

  • --ignore-rust-version CLI 选项
  • 将依赖项的版本要求设置得太高
  • 使用 --precisecargo update 指定版本

precise-pre-release

precise-pre-release 功能允许使用 update --precise 选择预发布版本,即使项目的 Cargo.toml 中未指定预发布版本。

以这个 Cargo.toml 为例。

[dependencies]
my-dependency = "0.1.1"

可以使用 update -Zunstable-options my-dependency --precise 0.1.2-pre.0my-dependency 更新为预发布版本。这是因为 0.1.2-pre.0 被认为与 0.1.1 兼容。无法以相同的方式从 0.1.1 升级到 0.2.0-pre.0

build-std

build-std 特性使 Cargo 能够在 crate 图编译过程中编译标准库本身。此特性在过去也被称为“std-aware Cargo”。此特性仍处于开发的非常早期阶段,并且也是 Cargo 中一项可能的大规模功能添加。即使以目前存在的最小形式,这也是一项需要记录的非常大的功能,因此如果您有兴趣了解最新信息,您需要关注 跟踪仓库 及其问题集。

今天实现的功能隐藏在一个名为 -Z build-std 的标志后面。此标志指示 Cargo 应使用与主构建本身相同的配置文件从源代码编译标准库。请注意,为此您需要准备好标准库的源代码,并且此时唯一支持的方法是添加 rust-src rust rustup 组件

$ rustup component add rust-src --toolchain nightly

今天还需要将 -Z build-std 标志与 --target 标志结合使用。请注意,您不必进行交叉编译,您只需以一种或另一种形式传递 --target

用法如下所示

$ cargo new foo
$ cd foo
$ cargo +nightly run -Z build-std --target x86_64-unknown-linux-gnu
   Compiling core v0.0.0 (...)
   ...
   Compiling foo v0.1.0 (...)
    Finished dev [unoptimized + debuginfo] target(s) in 21.00s
     Running `target/x86_64-unknown-linux-gnu/debug/foo`
Hello, world!

在这里,我们重新编译了调试模式下带有调试断言的标准库(如 src/main.rs 的编译方式),最后将所有内容链接在一起。

使用 -Z build-std 将隐式编译稳定的 crate corestdallocproc_macro。如果您正在使用 cargo test,它还将编译 test crate。如果您使用的环境不支持其中一些 crate,那么您也可以将参数传递给 -Zbuild-std

$ cargo +nightly build -Z build-std=core,alloc

这里的值是用逗号分隔的要构建的标准库 crate 列表。

要求

总而言之,今天使用 -Z build-std 的要求列表是

  • 您必须通过 rustup component add rust-src 安装 libstd 的源代码
  • 您必须传递 --target
  • 您必须同时使用 nightly Cargo 和 nightly rustc
  • 必须将 -Z build-std 标志传递给所有 cargo 调用。

报告错误和提供帮助

-Z build-std 功能处于开发的非常早期阶段!Cargo 的这个功能历史悠久,范围非常广,这仅仅是个开始。如果您想报告错误,请将其报告给

此外,如果您想查看尚未实现的功能和/或某些功能的运行方式与您的预期不符,请随时查看跟踪仓库的 问题跟踪器,如果它不存在,请提交新问题!

build-std-features

此标志是 -Zbuild-std 功能标志的同级标志。这将在构建标准库时配置为标准库本身启用的功能。目前默认启用的功能是 backtracepanic-unwind。此标志需要一个逗号分隔的列表,如果提供,将覆盖已启用的功能的默认列表。

binary-dep-depinfo

  • 跟踪 rustc 问题:#63012

-Z binary-dep-depinfo 标志使 Cargo 将相同的标志转发给 rustc,这将导致 rustc 在“dep info”文件中包含所有二进制依赖项的路径(扩展名为 .d)。然后 Cargo 使用该信息进行变更检测(如果任何二进制依赖项发生变化,则将重建 crate)。主要用例是构建编译器本身,它对标准库具有隐式依赖关系,否则这些依赖关系将无法跟踪以进行变更检测。

panic-abort-tests

-Z panic-abort-tests 标志将启用 nightly 支持以使用 -Cpanic=abort 编译测试工具 crate。如果没有此标志,Cargo 将使用 -Cpanic=unwind 编译测试及其依赖的所有内容,因为这是 test-the-crate 知道的唯一操作方式。但是,从 rust-lang/rust#64158 开始,test crate 支持 -C panic=abort,每个进程进行一次测试,并且可以帮助避免多次编译 crate 图。

目前尚不清楚此功能将如何在 Cargo 中稳定下来,但我们希望以某种方式稳定它!

config-include

此功能需要 -Zconfig-include 命令行选项。

配置文件中的 include 键可用于加载另一个配置文件。它接受一个字符串作为相对于配置文件的另一个文件的路径,或一个配置文件路径数组。仅接受以 .toml 结尾的路径。

# a path ending with `.toml`
include = "path/to/mordor.toml"

# or an array of paths
include = ["frodo.toml", "samwise.toml"]

与其他配置值不同,include 键的合并行为不同。当配置文件包含 include 键时

  1. 首先从 include 路径加载配置值。
    • 如果 include 键的值是一个路径数组,则从左到右加载和合并每个路径的配置值。
    • 如果来自 include 路径的配置值也包含 include 键,则递归执行此步骤。
  2. 然后,将配置文件自身的配置值合并到来自 include 路径的配置之上。

target-applies-to-host

历史上,Cargo 对于环境变量和 [target] 中的 linkerrustflags 配置选项是否适用于构建脚本、插件和其他始终为主机平台构建的工件的行为一直有些不一致。当未传递 --target 时,Cargo 尊重构建脚本的 linkerrustflags 与所有其他编译工件相同。但是,当传递 --target 时,Cargo 尊重 [target.<host triple>] 中的 linker,并且不获取任何 rustflags 配置。这种双重行为令人困惑,但也使得难以正确配置主机三元组和 目标三元组 恰好相同但应以不同方式配置要在构建主机上运行的工件的构建。

-Ztarget-applies-to-host 启用 Cargo 配置文件中的顶级 target-applies-to-host 设置,允许用户选择这些属性的不同(且更一致)行为。当 target-applies-to-host 在配置文件中未设置或设置为 true 时,将保留现有的 Cargo 行为(尽管请参阅 -Zhost-config,它更改了该默认值)。当它设置为 false 时,无论是否将 --target 传递给 Cargo,都不会为主机工件尊重 [target.<host triple>]RUSTFLAGS[build] 中的任何选项。要自定义要在主机上运行的工件,请使用 [host]host-config)。

将来,target-applies-to-host 最终可能会默认为 false,以提供更合理和一致的默认行为。

# config.toml
target-applies-to-host = false
cargo +nightly -Ztarget-applies-to-host build --target x86_64-unknown-linux-gnu

host-config

配置文件中的 host 键可用于将标志传递给主机构建目标,例如在交叉编译时必须在主机系统而不是目标系统上运行的构建脚本。它支持通用表和主机架构特定表。匹配的主机架构表优先于通用主机表。

它需要设置 -Zhost-config-Ztarget-applies-to-host 命令行选项,并在 Cargo 配置文件中设置 target-applies-to-host = false

# config.toml
[host]
linker = "/path/to/host/linker"
[host.x86_64-unknown-linux-gnu]
linker = "/path/to/host/arch/linker"
rustflags = ["-Clink-arg=--verbose"]
[target.x86_64-unknown-linux-gnu]
linker = "/path/to/target/linker"

x86_64-unknown-linux-gnu 主机上构建时,上面的通用 host 表将被完全忽略,因为 host.x86_64-unknown-linux-gnu 表优先。

设置 -Zhost-config 会将 target-applies-to-host 的默认值从 true 更改为 false

cargo +nightly -Ztarget-applies-to-host -Zhost-config build --target x86_64-unknown-linux-gnu

unit-graph

--unit-graph 标志可以传递给任何构建命令(buildcheckruntestbenchdoc 等),以向 stdout 发出一个表示 Cargo 内部单元图的 JSON 对象。实际上没有构建任何东西,并且命令在打印后立即返回。每个“单元”对应于编译器的一次执行。这些对象还包括每个单元依赖于哪个单元。

cargo +nightly build --unit-graph -Z unstable-options

此结构提供了 Cargo 所看到的依赖关系的更完整视图。特别是,“features”字段支持新的功能解析器,其中可以使用不同的功能多次构建依赖项。cargo metadata 从根本上无法表示不同依赖类型之间特征的关系,并且特征现在取决于运行哪个命令以及选择了哪些包和目标。此外,它还可以提供有关包内依赖项的详细信息,例如构建脚本或测试。

以下是 JSON 结构的描述

{
  /* Version of the JSON output structure. If any backwards incompatible
     changes are made, this value will be increased.
  */
  "version": 1,
  /* Array of all build units. */
  "units": [
    {
      /* An opaque string which indicates the package.
         Information about the package can be obtained from `cargo metadata`.
      */
      "pkg_id": "my-package 0.1.0 (path+file:///path/to/my-package)",
      /* The Cargo target. See the `cargo metadata` documentation for more
         information about these fields.
         https://doc.rust-lang.net.cn/cargo/commands/cargo-metadata.html
      */
      "target": {
        "kind": ["lib"],
        "crate_types": ["lib"],
        "name": "my-package",
        "src_path": "/path/to/my-package/src/lib.rs",
        "edition": "2018",
        "test": true,
        "doctest": true
      },
      /* The profile settings for this unit.
         These values may not match the profile defined in the manifest.
         Units can use modified profile settings. For example, the "panic"
         setting can be overridden for tests to force it to "unwind".
      */
      "profile": {
        /* The profile name these settings are derived from. */
        "name": "dev",
        /* The optimization level as a string. */
        "opt_level": "0",
        /* The LTO setting as a string. */
        "lto": "false",
        /* The codegen units as an integer.
           `null` if it should use the compiler's default.
        */
        "codegen_units": null,
        /* The debug information level as an integer.
           `null` if it should use the compiler's default (0).
        */
        "debuginfo": 2,
        /* Whether or not debug-assertions are enabled. */
        "debug_assertions": true,
        /* Whether or not overflow-checks are enabled. */
        "overflow_checks": true,
        /* Whether or not rpath is enabled. */
        "rpath": false,
        /* Whether or not incremental is enabled. */
        "incremental": true,
        /* The panic strategy, "unwind" or "abort". */
        "panic": "unwind"
      },
      /* Which platform this target is being built for.
         A value of `null` indicates it is for the host.
         Otherwise it is a string of the target triple (such as
         "x86_64-unknown-linux-gnu").
      */
      "platform": null,
      /* The "mode" for this unit. Valid values:

         * "test" --- Build using `rustc` as a test.
         * "build" --- Build using `rustc`.
         * "check" --- Build using `rustc` in "check" mode.
         * "doc" --- Build using `rustdoc`.
         * "doctest" --- Test using `rustdoc`.
         * "run-custom-build" --- Represents the execution of a build script.
      */
      "mode": "build",
      /* Array of features enabled on this unit as strings. */
      "features": ["somefeat"],
      /* Whether or not this is a standard-library unit,
         part of the unstable build-std feature.
         If not set, treat as `false`.
      */
      "is_std": false,
      /* Array of dependencies of this unit. */
      "dependencies": [
        {
          /* Index in the "units" array for the dependency. */
          "index": 1,
          /* The name that this dependency will be referred as. */
          "extern_crate_name": "unicode_xid",
          /* Whether or not this dependency is "public",
             part of the unstable public-dependency feature.
             If not set, the public-dependency feature is not enabled.
          */
          "public": false,
          /* Whether or not this dependency is injected into the prelude,
             currently used by the build-std feature.
             If not set, treat as `false`.
          */
          "noprelude": false
        }
      ]
    },
    // ...
  ],
  /* Array of indices in the "units" array that are the "roots" of the
     dependency graph.
  */
  "roots": [0],
}

配置文件 rustflags 选项

此功能在 [profile] 部分提供了一个新选项,用于指定直接传递给 rustc 的标志。可以像这样启用

cargo-features = ["profile-rustflags"]

[package]
# ...

[profile.release]
rustflags = [ "-C", "..." ]

要在 Cargo 配置中的配置文件中设置它,您需要使用 -Z profile-rustflags[unstable] 表来启用它。例如,

# .cargo/config.toml
[unstable]
profile-rustflags = true

[profile.release]
rustflags = [ "-C", "..." ]

rustdoc-map

此功能添加了传递给 rustdoc 的配置设置,以便它可以在未记录依赖项时生成指向文档托管在其他地方的依赖项的链接。首先,将此添加到 .cargo/config

[doc.extern-map.registries]
crates-io = "https://docs.rs/"

然后,在构建文档时,使用以下标志使指向依赖项的链接链接到 docs.rs

cargo +nightly doc --no-deps -Zrustdoc-map

registries 表包含注册表名称到要链接到的 URL 的映射。URL 可能具有标记 {pkg_name}{version},它们将被替换为相应的值。如果两者均未指定,则 Cargo 默认将 {pkg_name}/{version}/ 附加到 URL 的末尾。

另一个配置设置可用于重定向标准库链接。默认情况下,rustdoc 创建指向 https://doc.rust-lang.net.cn/nightly/ 的链接。要更改此行为,请使用 doc.extern-map.std 设置

[doc.extern-map]
std = "local"

值为 "local" 表示链接到 rustc sysroot 中的文档。如果您使用的是 rustup,则可以使用 rustup component add rust-docs 安装此文档。

默认值为 "remote"

该值也可以采用自定义位置的 URL。

per-package-target

per-package-target 功能为清单添加了两个键:package.default-targetpackage.forced-target。第一个使包默认情况下(即,当未传递 --target 参数时)为某个目标编译。第二个使包始终为目标编译。

例子

[package]
forced-target = "wasm32-unknown-unknown"

在这个例子中,crate 总是为 wasm32-unknown-unknown 构建,例如因为它将被用作在主机(或在命令行上提供)目标上运行的主程序的插件。

artifact-dependencies

工件依赖项允许 Cargo 包依赖于 bincdylibstaticlib crate,并在编译时使用这些 crate 构建的工件。

使用 -Z bindeps 运行 cargo 以启用此功能。

工件依赖项:依赖项声明

工件依赖项将以下键添加到 Cargo.toml 中的依赖项声明中

  • artifact — 这指定要构建的 Cargo 目标。通常,如果没有此字段,Cargo 将仅从依赖项构建 [lib] 目标。此字段允许指定将构建哪个目标,并在构建时将其作为二进制文件提供

    • "bin" — 编译后的可执行二进制文件,对应于依赖项清单中的所有 [[bin]] 部分。
    • "bin:<bin-name>" — 编译后的可执行二进制文件,对应于由给定 <bin-name> 指定的特定二进制目标。
    • "cdylib" — 与 C 兼容的动态库,对应于依赖项清单中 crate-type = ["cdylib"][lib] 部分。
    • "staticlib" — 与 C 兼容的静态库,对应于依赖项清单中 crate-type = ["staticlib"][lib] 部分。

    artifact 值可以是字符串,也可以是字符串数组以指定多个目标。

    例子

    [dependencies]
    bar = { version = "1.0", artifact = "staticlib" }
    zoo = { version = "1.0", artifact = ["bin:cat", "bin:dog"]}
    
  • lib — 这是一个布尔值,指示是否还要将依赖项的库构建为普通的 Rust lib 依赖项。仅当指定了 artifact 时,才能指定此字段。

    指定 artifact 时,此字段的默认值为 false。如果将其设置为 true,则还将为声明包正在构建的目标平台构建依赖项的 [lib] 目标。这允许包除了工件依赖项之外,还可以像普通依赖项一样从 Rust 代码中使用依赖项。

    例子

    [dependencies]
    bar = { version = "1.0", artifact = "bin", lib = true }
    
  • target — 要为其构建依赖项的目标平台。仅当指定了 artifact 时,才能指定此字段。

    如果未指定,则默认值取决于依赖项类型。对于构建依赖项,它将为主机目标构建。对于所有其他依赖项,它将为声明包构建的相同目标构建。

    对于构建依赖项,这也可以采用特殊值 "target",这意味着为包正在构建的相同目标构建依赖项。

    [build-dependencies]
    bar = { version = "1.0", artifact = "cdylib", target = "wasm32-unknown-unknown"}
    same-target = { version = "1.0", artifact = "bin", target = "target" }
    

工件依赖项:环境变量

构建工件依赖项后,Cargo 提供以下环境变量,您可以使用它们来访问工件

  • CARGO_<ARTIFACT-TYPE>_DIR_<DEP> — 这是包含依赖项中所有工件的目录。

    <ARTIFACT-TYPE> 是为依赖项指定的 artifact(大写,如 CDYLIBSTATICLIBBIN),<DEP> 是依赖项的名称。与其他 Cargo 环境变量一样,依赖项名称将转换为大写,破折号替换为下划线。

    如果您的清单重命名了依赖项,则 <DEP> 对应于您指定的名称,而不是原始包名称。

  • CARGO_<ARTIFACT-TYPE>_FILE_<DEP>_<NAME> — 这是工件的完整路径。

    <ARTIFACT-TYPE> 是为依赖项指定的 artifact(如上所述大写),<DEP> 是依赖项的名称(如上所述转换),<NAME> 是依赖项中工件的名称。

    请注意,<NAME> 不会以任何方式从提供工件的 crate 中指定的 name 或未指定时的 crate 名称进行修改;例如,它可以是小写的,或者包含破折号。

    为方便起见,如果工件名称与原始包名称匹配,Cargo 还会提供此变量的副本,并省略 _<NAME> 后缀。例如,如果 cmake crate 提供了一个名为 cmake 的二进制文件,Cargo 会同时提供 CARGO_BIN_FILE_CMAKECARGO_BIN_FILE_CMAKE_cmake

对于每种依赖项,这些变量都提供给构建过程中可以访问该种依赖项的部分

  • 对于构建依赖项,这些变量提供给 build.rs 脚本,并且可以使用 std::env::var_os 访问。(与任何操作系统文件路径一样,这些路径可能是也可能不是有效的 UTF-8。)
  • 对于普通依赖项,这些变量在 crate 编译期间提供,并且可以使用 env! 宏访问。
  • 对于开发依赖项,这些变量在示例、测试和基准测试的编译期间提供,并且可以使用 env! 宏访问。

工件依赖项:示例

示例:使用构建脚本中的二进制可执行文件

Cargo.toml 文件中,您可以指定对二进制文件的依赖项,以便为构建脚本提供该二进制文件

[build-dependencies]
some-build-tool = { version = "1.0", artifact = "bin" }

然后在构建脚本中,可以在构建时执行二进制文件

fn main() {
    let build_tool = std::env::var_os("CARGO_BIN_FILE_SOME_BUILD_TOOL").unwrap();
    let status = std::process::Command::new(build_tool)
        .arg("do-stuff")
        .status()
        .unwrap();
    if !status.success() {
        eprintln!("failed!");
        std::process::exit(1);
    }
}

示例:在构建脚本中使用 cdylib 工件

使用包中的 Cargo.toml,为特定构建目标将 bar 库构建为 cdylib

[build-dependencies]
bar = { artifact = "cdylib", version = "1.0", target = "wasm32-unknown-unknown" }

…以及 build.rs 中的构建脚本。

fn main() {
    wasm::run_file(std::env::var("CARGO_CDYLIB_FILE_BAR").unwrap());
}

示例:在二进制文件中使用 二进制 工件及其库

使用包中的 Cargo.toml,构建 bar 二进制文件以作为工件包含,同时将其作为库提供…

[dependencies]
bar = { artifact = "bin", version = "1.0", lib = true }

…以及使用 main.rs 的可执行文件。

fn main() {
    bar::init();
    command::run(env!("CARGO_BIN_FILE_BAR"));
}

发布超时

配置文件中的 publish.timeout 键可用于控制 cargo publish 在将包发布到注册表和它在本地索引中可用之间等待的时间。

超时 0 会阻止执行任何检查。当前默认值为 60 秒。

它需要设置 -Zpublish-timeout 命令行选项。

# config.toml
[publish]
timeout = 300  # in seconds

非对称令牌

-Z asymmetric-token 标志启用 cargo:paseto 凭据提供程序,该程序允许 Cargo 向注册表进行身份验证,而无需通过网络发送密钥。

config.tomlcredentials.toml 文件中,有一个名为 private-key 的字段,它是一个以 PASERK 的密钥子集 格式化的私钥,用于对非对称令牌进行签名

可以使用 cargo login --generate-keypair 生成密钥对,这将

  • 以当前推荐的方式生成公钥/私钥对。
  • 将私钥保存在 credentials.toml 中。
  • PASERK 公钥 格式打印公钥。

建议将 private-key 保存在 credentials.toml 中。它在 config.toml 中也受支持,主要是为了可以使用关联的环境变量进行设置,这是在 CI 上下文中提供它的推荐方法。此设置与我们用于设置密钥令牌的 token 字段相同。

还有一个名为 private-key-subject 的可选字段,它是由注册表选择的字符串。此字符串将作为非对称令牌的一部分包含在内,并且不应该是密钥。它适用于“加密证明中央 CA 服务器授权此操作”等罕见用例。Cargo 要求它是非空白可打印 ASCII 字符。需要非 ASCII 数据的注册表应对其进行 base64 编码。

可以使用 cargo login --registry=name --private-key --private-key-subject="subject" 设置这两个字段,这将提示您输入密钥值。

注册表最多可以设置 private-keytoken 中的一个。

所有 PASETO 都将包含 iat,即以 ISO 8601 格式表示的当前时间。Cargo 将在适当时包含以下内容

  • sub 一个可选的、非密钥字符串,由注册表选择,预计每次请求都会声明。该值将是 config.toml 文件中的 private-key-subject
  • mutation 如果存在,则表示此请求是一个 mutating 操作(如果不存在,则是一个只读操作),必须是字符串 publishyankunyank 之一。
    • name 与此请求相关的 crate 的名称。
    • vers 与此请求相关的 crate 的版本字符串。
    • cksum crate 内容的 SHA256 哈希值,以 64 个小写十六进制数字的字符串表示,仅当 mutation 等于 publish 时才必须存在
  • challenge 此会话中从此服务器收到的 401/403 的质询字符串。发出质询的注册表必须跟踪已发出/使用的质询,并且在同一有效期内永远不要接受给定的质询超过一次(避免需要跟踪曾经发出的每个质询)。

“页脚”(签名的一部分)将是一个 UTF-8 编码的 JSON 字符串,并包含

  • url Cargo 获取 config.json 文件的 RFC 3986 兼容 URL,
    • 如果这是一个带有 HTTP 索引的注册表,则这是所有索引查询都相对于的基 URL。
    • 如果这是一个带有 GIT 索引的注册表,则它是 Cargo 用于克隆索引的 URL。
  • kid 用于对请求进行签名的私钥的标识符,使用 PASERK ID 标准。

PASETO 包含已签名的消息,因此服务器不必从请求中重建确切的字符串来检查签名。服务器确实需要检查签名对于 PASETO 中的字符串是否有效,以及该字符串的内容是否与请求匹配。如果请求应该包含声明但 PASETO 中缺少声明,则必须拒绝该请求。

cargo config

cargo config 子命令提供了一种显示 cargo 加载的配置文件的方法。它目前包含 get 子命令,该子命令可以采用可选的配置值来显示。

cargo +nightly -Zunstable-options config get build.rustflags

如果未包含配置值,它将显示所有配置值。有关可用选项的更多信息,请参阅 --help 输出。

rustc --print

cargo rustc --print=VAL--print 标志转发给 rustc,以便从 rustc 中提取信息。这将使用相应的 --print 标志运行 rustc,然后立即退出,而不进行编译。将其作为 cargo 标志公开允许 cargo 根据当前配置注入正确的目标和 RUSTFLAGS。

主要用例是运行 cargo rustc --print=cfg 以获取适用于目标并受任何其他 RUSTFLAGS 影响的配置值。

不同的二进制文件名

different-binary-name 功能允许设置二进制文件的名称,而不必遵守对 crate 名称的限制。例如,crate 名称只能使用 字母数字 字符或 -_,并且不能为空。

filename 参数不应包含二进制文件扩展名,cargo 会自行确定适当的扩展名并将其用于二进制文件。

filename 参数仅在清单的 [[bin]] 部分可用。

cargo-features = ["different-binary-name"]

[package]
name =  "foo"
version = "0.0.1"

[[bin]]
name = "foo"
filename = "007bar"
path = "src/main.rs"

抓取示例

-Z rustdoc-scrape-examples 标志告诉 Rustdoc 在当前工作区中搜索对函数的调用。然后将这些调用站点包含为文档。您可以像这样使用该标志

cargo doc -Z unstable-options -Z rustdoc-scrape-examples

默认情况下,Cargo 将从要记录的包的示例目标中抓取示例。您可以使用 doc-scrape-examples 标志单独启用或禁用要抓取的目标,例如

# Enable scraping examples from a library
[lib]
doc-scrape-examples = true

# Disable scraping examples from an example target
[[example]]
name = "my-example"
doc-scrape-examples = false

关于测试的注意事项:在测试目标上启用 doc-scrape-examples 目前不会产生任何影响。从测试中抓取示例是一项正在进行的工作。

关于开发依赖项的注意事项:记录库通常不需要 crate 的开发依赖项。但是,示例目标需要开发依赖项。为了向后兼容,-Z rustdoc-scrape-examples 不会为 cargo doc 引入开发依赖项要求。因此,在以下情况下,不会从示例目标中抓取示例

  1. 没有要记录的目标需要开发依赖项,并且
  2. 至少有一个具有要记录目标的 crate 具有开发依赖项,并且
  3. 所有 [[example]] 目标的 doc-scrape-examples 参数都未设置或为 false。

如果您希望从示例目标中抓取示例,则不得满足上述任何一个条件。例如,您可以为一个示例目标将 doc-scrape-examples 设置为 true,这向 Cargo 发出信号,表明您可以接受为 cargo doc 构建开发依赖项。

rustdoc 的输出格式

此标志确定 cargo rustdoc 的输出格式,接受 htmljson,为工具提供了一种依赖 rustdoc 的实验性 JSON 格式 的方法。

您可以像这样使用该标志

cargo rustdoc -Z unstable-options --output-format json

检查配置

-Z check-cfg 命令行参数使用 rustcrustdoc 不稳定的 --check-cfg 命令行参数,在 #[cfg]cfg!#[link]#[cfg_attr] 中启用 Cargo 功能以及 rustc 已知名称和值的编译时检查。

您可以像这样使用该标志

cargo check -Z unstable-options -Z check-cfg

cargo::rustc-check-cfg=CHECK_CFG

rustc-check-cfg 指令告诉 Cargo 将给定值传递给编译器的 --check-cfg 标志。这可用于在编译时检测意外的条件编译名称和/或值。

这只能与 -Zcheck-cfg 结合使用,否则将被忽略并发出警告。

如果您想与 Cargo 功能集成,请仅使用 -Zcheck-cfg,而不要尝试使用此选项手动执行。

您可以像这样使用该指令

#![allow(unused)]
fn main() {
// build.rs
println!("cargo::rustc-check-cfg=cfg(foo, bar)");
}
cargo check -Z unstable-options -Z check-cfg

代码生成后端

codegen-backend 功能可以使用配置文件选择 rustc 使用的代码生成后端。

例子

[package]
name = "foo"

[dependencies]
serde = "1.0.117"

[profile.dev.package.foo]
codegen-backend = "cranelift"

要在 Cargo 配置中的配置文件中设置此项,您需要使用 -Z codegen-backend[unstable] 表将其启用。例如,

# .cargo/config.toml
[unstable]
codegen-backend = true

[profile.dev.package.foo]
codegen-backend = "cranelift"

gitoxide

使用“gitoxide”不稳定功能,所有或指定的 git 操作将由 gitoxide crate 而不是 git2 执行。

虽然 -Zgitoxide 启用了当前实现的所有功能,但可以使用 -Zgitoxide=operation[,operationN] 语法单独选择要使用 gitoxide 运行的 git 操作。

有效操作如下

  • fetch - 所有获取都使用 gitoxide 完成,包括 git 依赖项以及 crates 索引。
  • checkout (计划中) - 检出工作树,支持过滤器和子模块。

git

使用“git”不稳定功能,gitoxidegit2 都将对 crate 索引和 git 依赖项执行浅层获取。

虽然 -Zgit 启用了当前实现的所有功能,但可以使用 -Zgit=operation[,operationN] 语法单独选择何时执行浅层获取。

有效操作如下

  • shallow-index - 对索引执行浅层克隆。
  • shallow-deps - 对 git 依赖项执行浅层克隆。

关于浅层克隆的详细信息

  • 要启用浅层克隆,请添加 -Zgit=shallow-deps 以获取 git 依赖项,或添加 -Zgit=shallow-index 以获取注册表索引。
  • 浅层克隆和浅层检出的 git 存储库位于其自己的 -shallow 后缀目录中,即
    • ~/.cargo/registry/index/*-shallow
    • ~/.cargo/git/db/*-shallow
    • ~/.cargo/git/checkouts/*-shallow
  • 启用不稳定功能后,获取/克隆 git 存储库始终是浅层获取。这大致相当于在任何地方都使用 git fetch --depth 1
  • 即使存在 Cargo.lock 或指定了提交 { rev = "…" },gitoxide 和 libgit2 也足够智能,可以在不取消现有存储库的浅层化的情况下执行浅层获取。

脚本

Cargo 可以直接运行 .rs 文件,如

$ cargo +nightly -Zscript file.rs

其中 file.rs 可以像这样简单

fn main() {}

用户可以选择在模块级注释中的 cargo 代码围栏中指定清单,例如

#!/usr/bin/env -S cargo +nightly -Zscript
```cargo
[dependencies]
clap = { version = "4.2", features = ["derive"] }
```

use clap::Parser;

#[derive(Parser, Debug)]
#[clap(version)]
struct Args {
    #[clap(short, long, help = "Path to config")]
    config: Option<std::path::PathBuf>,
}

fn main() {
    let args = Args::parse();
    println!("{:?}", args);
}

单文件包

除了现有的多文件包(包含其他 .rs 文件的 Cargo.toml 文件)之外,我们还添加了单文件包的概念,这些包可能包含嵌入式清单。单文件 .rs 包与任何其他 .rs 文件之间没有必要的区别。

可以使用 --manifest-path 选择单文件包,例如 cargo test --manifest-path foo.rs。与 Cargo.toml 不同,无法自动发现这些文件。

单文件包可能包含嵌入式清单。嵌入式清单使用 TOML 存储在 rust“frontmatter”中,这是一个 markdown 代码围栏,在文件顶部的信息字符串开头带有 cargo

推断/默认的清单字段

  • package.name = <文件名的 slug 化版本>
  • package.edition = <当前版本> 以避免始终必须添加嵌入式清单,但代价是可能会破坏 rust 升级后的脚本
    • 未指定 edition 时发出警告,以提高对此的认识

不允许使用的清单字段

  • [workspace][lib][[bin]][[example]][[test]][[bench]]
  • package.workspacepackage.buildpackage.linkspackage.autobinspackage.autoexamplespackage.autotestspackage.autobenches

单文件包的默认 CARGO_TARGET_DIR 位于 $CARGO_HOME/target/<哈希值>

  • 避免多个单文件包位于同一目录中导致冲突
  • 避免单文件包的父目录为只读导致问题
  • 避免用户目录混乱

单文件包的锁定文件将放置在 CARGO_TARGET_DIR 中。将来,当支持工作区时,这将允许用户拥有持久化的锁定文件。

清单命令

您可以将清单直接传递给 cargo 命令,而无需子命令,例如 foo/Cargo.toml 或单文件包,例如 foo.rs。这主要用于放在 #! 行中。

解释 cargo <子命令> 的优先级如下

  1. 内置包或单文件包
  2. 别名
  3. 外部子命令

如果参数具有以下任何一项,则将其标识为清单命令:

  • 路径分隔符
  • .rs 扩展名
  • 文件名是 Cargo.toml

cargo run --manifest-path <path>cargo <path> 之间的区别

  • cargo <path> 使用 <path> 的配置运行,而不是当前目录的配置,更像是 cargo install --path <path>
  • cargo <path> 的详细程度低于正常的默认值。传递 -v 以获取正常输出。

文档更新

2024 版

可以通过将 edition2024 不稳定功能添加到 Cargo.toml 的顶部来启用对 2024 的支持

cargo-features = ["edition2024"]

[package]
name = "my-package"
version = "0.1.0"
edition = "2024"

如果要将现有项目从以前的版本转换,则可以在 nightly 频道上使用 cargo fix --edition。运行 cargo fix 后,您可以按照上面的说明将版本切换到 2024。

此功能非常不稳定,仅用于早期测试和实验。未来的 nightly 版本可能会引入 2024 版的更改,这些更改可能会破坏您的构建。

配置文件 trim-paths 选项

这添加了一个新的配置文件设置,用于控制如何在生成的二进制文件中清理路径。可以像这样启用

cargo-features = ["trim-paths"]

[package]
# ...

[profile.release]
trim-paths = ["diagnostics", "object"]

要在 Cargo 配置中的配置文件中设置此项,您需要使用 -Z trim-paths[unstable] 表来启用它。例如,

# .cargo/config.toml
[unstable]
trim-paths = true

[profile.release]
trim-paths = ["diagnostics", "object"]

文档更新

trim-paths

作为新的 “配置文件设置”条目

trim-paths 是一个配置文件设置,用于启用和控制构建输出中文件路径的清理。它采用以下值

  • "none"false — 禁用路径清理
  • "macro" — 在 std::file!() 宏的扩展中清理路径。这是嵌入式恐慌消息中路径的来源
  • "diagnostics" — 清理打印的编译器诊断信息中的路径
  • "object" — 清理已编译的可执行文件或库中的路径
  • "all"true — 清理所有可能位置的路径

它还接受包含 "macro""diagnostics""object" 组合的数组。

对于 dev 配置文件,它默认为 none,对于 release 配置文件,它默认为 object。您可以通过在 Cargo.toml 中指定此选项来手动覆盖它

[profile.dev]
trim-paths = "all"

[profile.release]
trim-paths = ["object", "diagnostics"]

默认的 release 配置文件设置 (object) 仅清理已发出的可执行文件或库文件中的路径。它始终会影响来自宏(如恐慌消息)的路径,并且仅在调试信息将与二进制文件一起嵌入时才会影响调试信息(在具有 ELF 二进制文件的平台上默认,例如 Linux 和 windows-gnu),但如果它们位于单独的文件中,则不会触及它们(Windows MSVC 和 macOS 上的默认设置)。但指向这些单独文件的路径会被清理。

如果 trim-paths 不是 nonefalse,则如果以下路径出现在选定的范围内,则会对其进行清理

  1. 标准库和核心库(sysroot)的源文件路径将以 /rustc/[rustc commit hash] 开头,例如 /home/username/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs -> /rustc/fe72845f7bb6a77b9e671e6a4f32fe714962cec4/library/core/src/result.rs
  2. 当前包的路径将被剥离,相对于当前工作空间根目录,例如 /home/username/crate/src/lib.rs -> src/lib.rs
  3. 依赖包的路径将替换为 [package name]-[version]。例如 /home/username/deps/foo/src/lib.rs -> foo-0.1.0/src/lib.rs

当标准库和核心库的源文件路径不在清理范围内时,发出的路径将取决于 rust-src 组件是否存在。如果存在,则某些路径将指向文件系统上源文件的副本;如果不存在,则它们将显示为 /rustc/[rustc commit hash]/library/...(就像选择对其进行清理时一样)。指向所有其他源文件的路径将不受影响。

这不会影响源代码中任何硬编码的路径,例如字符串中的路径。

环境变量

作为 “Cargo 为构建脚本设置的环境变量” 的新条目

  • CARGO_TRIM_PATHStrim-paths 配置文件选项的值。false"none" 和空数组将转换为 nonetrue"all" 变为 all。非空数组中的值将连接成逗号分隔的列表。如果构建脚本引入了构建工件的绝对路径(例如通过调用编译器),则用户可以请求在不同类型的工件中对其进行清理。需要清理的常见路径包括 OUT_DIRCARGO_MANIFEST_DIR,以及构建脚本引入的任何其他路径,例如包含目录。

gc

-Zgc 标志启用 cargo 主目录中 cargo 全局缓存内的垃圾收集。这包括下载的依赖项,例如压缩的 .crate 文件、解压缩的 src 目录、注册表索引缓存和 git 依赖项。当存在 -Zgc 时,cargo 将跟踪任何索引和依赖项的最后一次使用时间,然后使用这些时间戳手动或自动删除一段时间未使用的缓存条目。

cargo build -Zgc

自动垃圾收集

自动删除发生在已经在执行大量工作的命令上,例如所有构建命令(cargo buildcargo testcargo check 等)和 cargo fetch。删除发生在解析之后和包下载之后。自动删除每天只执行一次(有关配置,请参阅 gc.auto.frequency)。如果 cargo 处于离线状态(例如使用 --offline--frozen),则会禁用自动删除,以避免删除如果您长时间离线可能需要使用的工件。

自动 gc 配置

可以通过 cargo 配置设置来指定自动 gc 行为。可用的设置有

# Example config.toml file.

# This table defines the behavior for automatic garbage collection.
[gc.auto]
# The maximum frequency that automatic garbage collection happens.
# Can be "never" to disable automatic-gc, or "always" to run on every command.
frequency = "1 day"
# Anything older than this duration will be deleted in the source cache.
max-src-age = "1 month"
# Anything older than this duration will be deleted in the compressed crate cache.
max-crate-age = "3 months"
# Any index older than this duration will be deleted from the index cache.
max-index-age = "3 months"
# Any git checkout older than this duration will be deleted from the checkout cache.
max-git-co-age = "1 month"
# Any git clone older than this duration will be deleted from the git cache.
max-git-db-age = "3 months"

使用 cargo clean 进行手动垃圾收集

可以使用 cargo clean gc 命令执行手动删除。可以通过传递以下缓存选项之一来执行缓存内容的删除

  • --max-src-age=DURATION — 删除自给定时间以来未使用的源缓存文件。
  • --max-crate-age=DURATION — 删除自给定时间以来未使用的 crate 缓存文件。
  • --max-index-age=DURATION — 删除自给定时间以来未使用的注册表索引(包括其 .cratesrc 文件)。
  • --max-git-co-age=DURATION — 删除自给定时间以来未使用的 git 依赖项签出。
  • --max-git-db-age=DURATION — 删除自给定时间以来未使用的 git 依赖项克隆。
  • --max-download-age=DURATION — 删除自给定时间以来未使用的任何下载的缓存数据。
  • --max-src-size=SIZE — 删除最旧的源缓存文件,直到缓存低于给定大小。
  • --max-crate-size=SIZE — 删除最旧的 crate 缓存文件,直到缓存低于给定大小。
  • --max-git-size=SIZE — 删除最旧的 git 依赖项缓存,直到缓存低于给定大小。
  • --max-download-size=SIZE — 删除最旧的下载缓存数据,直到缓存低于给定大小。

DURATION 的指定格式为“N 秒/分钟/小时/天/周/月”,其中 N 是一个整数。

SIZE 的指定格式为“N suffix”,其中 suffix 是 B、kB、MB、GB、kiB、MiB 或 GiB,N 是一个整数或浮点数。如果没有指定后缀,则该数字为字节数。

cargo clean gc
cargo clean gc --max-download-age=1week
cargo clean gc --max-git-size=0 --max-download-size=100MB

open-namespaces

允许多个包参与同一个 API 命名空间

可以像这样启用

cargo-features = ["open-namespaces"]

[package]
# ...

稳定和移除的功能

编译进度

compile-progress 功能已在 1.30 版本中稳定。进度条现在默认启用。有关控制此功能的更多信息,请参阅 term.progress

版本

Cargo.toml 中指定 edition 已在 1.31 版本中稳定。有关指定此字段的更多信息,请参阅 edition 字段

rename-dependency

Cargo.toml 中指定重命名的依赖项已在 1.31 版本中稳定。有关重命名依赖项的更多信息,请参阅 重命名依赖项

备用注册表

对备用注册表的支持已在 1.34 版本中稳定。有关备用注册表的更多信息,请参阅 注册表章节

离线模式

离线功能已在 1.36 版本中稳定。有关使用离线模式的更多信息,请参阅 --offline 标志

publish-lockfile

publish-lockfile 功能已在 1.37 版本中移除。如果包包含二进制目标,则发布包时始终包含 Cargo.lock 文件。cargo install 需要 --locked 标志才能使用 Cargo.lock 文件。有关更多信息,请参阅 cargo packagecargo install

default-run

default-run 功能已在 1.37 版本中稳定。有关指定要运行的默认目标的更多信息,请参阅 default-run 字段

cache-messages

编译器消息缓存已在 1.40 版本中稳定。编译器警告现在默认缓存,并在重新运行 Cargo 时自动重放。

install-upgrade

install-upgrade 功能已在 1.41 版本中稳定。cargo install 现在会在软件包看起来过时时自动升级它们。有关更多信息,请参阅 cargo install 文档。

配置文件覆盖

配置文件覆盖已在 1.41 版本中稳定。有关使用覆盖的更多信息,请参阅 配置文件覆盖

配置配置文件

在 Cargo 配置文件和环境变量中指定配置文件已在 1.43 版本中稳定。有关在配置文件中指定 配置文件 的更多信息,请参阅 config [profile]

crate-versions

-Z crate-versions 标志已在 1.47 版本中稳定。crate 版本现在自动包含在 cargo doc 文档侧边栏中。

功能

-Z features 标志已在 1.51 版本中稳定。有关使用新功能解析器的更多信息,请参阅 功能解析器版本 2

package-features

-Z package-features 标志已在 1.51 版本中稳定。有关使用功能 CLI 选项的更多信息,请参阅 解析器版本 2 命令行标志

解析器

Cargo.toml 中的 resolver 功能已在 1.51 版本中稳定。有关指定解析器的更多信息,请参阅解析器版本

在构建脚本中指定其他链接器参数的 extra-link-arg 功能已在 1.56 版本中稳定。有关指定额外链接器参数的更多信息,请参阅构建脚本文档

configurable-env

在 Cargo 配置中指定环境变量的 configurable-env 功能已在 1.56 版本中稳定。有关配置环境变量的更多信息,请参阅配置文档

rust-version

Cargo.toml 中的 rust-version 字段已在 1.56 版本中稳定。有关使用 rust-version 字段和 --ignore-rust-version 选项的更多信息,请参阅rust-version 字段

patch-in-config

-Z patch-in-config 标志以及 Cargo 配置文件中对 [patch] 部分的相应支持已在 1.56 版本中稳定。有关更多信息,请参阅patch 字段

2021 版

2021 版已在 1.56 版本中稳定。有关设置版本的更多信息,请参阅edition 字段。有关迁移现有项目的更多信息,请参阅cargo fix --edition版本指南

自定义命名配置文件

自定义命名配置文件已在 1.57 版本中稳定。有关更多信息,请参阅配置文件章节

配置文件 strip 选项

配置文件 strip 选项已在 1.59 版本中稳定。有关更多信息,请参阅配置文件章节

未来不兼容报告

对生成未来不兼容报告的支持已在 1.59 版本中稳定。有关更多信息,请参阅未来不兼容报告章节

命名空间功能

命名空间功能已在 1.60 版本中稳定。有关更多信息,请参阅功能章节

弱依赖功能

弱依赖功能已在 1.60 版本中稳定。有关更多信息,请参阅功能章节

timings

-Ztimings 选项已在 1.60 版本中稳定为 --timings。(--timings=html 和机器可读的 --timings=json 输出仍然不稳定,需要 -Zunstable-options。)

config-cli

--config CLI 选项已在 1.63 版本中稳定。有关更多信息,请参阅配置文档

multitarget

-Z multitarget 选项已在 1.64 版本中稳定。有关设置默认目标平台三元组的更多信息,请参阅build.target

crate-type

cargo rustc--crate-type 标志已在 1.64 版本中稳定。有关更多信息,请参阅cargo rustc 文档

工作区继承

工作区继承已在 1.64 版本中稳定。有关更多信息,请参阅workspace.packageworkspace.dependencies从工作区继承依赖项

terminal-width

-Z terminal-width 选项已在 1.68 版本中稳定。当从 Cargo 可以自动检测宽度的终端运行时,终端宽度始终会传递给编译器。

sparse-registry

稀疏注册表支持已在 1.68 版本中稳定。有关更多信息,请参阅注册表协议

cargo logout

cargo logout 命令已在 1.70 版本中稳定。

doctest-in-workspace

cargo test-Z doctest-in-workspace 选项已在 1.72 版本中稳定并默认启用。有关编译和运行测试的工作目录的更多信息,请参阅cargo test 文档

keep-going

--keep-going 选项已在 1.74 版本中稳定。有关更多详细信息,请参阅 cargo build 中的--keep-going 标志

[lints]

[lints](通过 -Zlints 启用)已在 1.74 版本中稳定。

credential-process

-Z credential-process 功能已在 1.74 版本中稳定。

有关详细信息,请参阅注册表身份验证文档。

registry-auth

-Z registry-auth 功能已在 1.74 版本中稳定,但附加要求是配置了凭据提供程序。

有关详细信息,请参阅注册表身份验证文档。