Cargo: 拒绝未使用的继承默认特性

概要

  • 如果工作区依赖项指定了 default-features = true (或未指定 default-features),则不再允许在继承的工作区依赖项中使用 default-features = false

详情

工作区继承 允许您在一个地方(工作区)指定依赖项,然后从包内引用这些工作区依赖项。在 default-features 的指定方式上存在一个无意的交互,这在 2024 Edition 中不再被允许。

除非工作区指定了 default-features = false,否则不再允许在继承的包依赖项中指定 default-features = false。例如,对于指定了以下内容的工作区:

[workspace.dependencies]
regex = "1.10.4"

以下代码现在会报错

[package]
name = "foo"
version = "1.0.0"
edition = "2024"

[dependencies]
regex = { workspace = true, default-features = false }  # ERROR

此更改的原因是为了避免在默认特性已经启用时指定 default-features = false 造成的困惑,因为它不起任何作用。

如果您希望能够灵活地决定依赖项是否启用其依赖项的默认特性,请务必在工作区定义中设置 default-features = false。 请注意,如果您同时构建多个工作区成员,特性将被统一,因此如果一个成员设置了 default-features = true(如果未显式设置,则为默认值),则使用该依赖项的所有成员都将启用默认特性。

迁移

当使用 cargo fix --edition 时,Cargo 将自动更新您的 Cargo.toml 文件,以删除这种情况下的 default-features = false

如果您希望手动更新您的 Cargo.toml 文件,请检查在运行构建时是否有任何警告,并删除相应的条目。 之前的版本应该会显示类似以下内容:

warning: /home/project/Cargo.toml: `default-features` is ignored for regex,
since `default-features` was not specified for `workspace.dependencies.regex`,
this could become a hard error in the future