Cargo 如何更改配置中数组的合并方式

2023 年 8 月 24 日 · Arlo Siemsen 代表 Cargo 团队

Cargo 将更改合并配置数组的顺序,我们正在寻找人员来帮助测试此更改并提供反馈。

当 Cargo 的配置中的数组在多个位置定义时,元素会被合并在一起。元素的合并顺序与合并其他配置类型的方式不一致,并且没有按预期工作。

新的合并顺序将与非数组 配置 的优先级顺序相匹配,优先级较高的配置将放置在数组的后面。

build.rustflags 的情况下,这解决了令人困惑的情况,即优先级较高的标志(在项目的 config.toml 中)会被优先级较低的标志(例如,在全局 $CARGO_HOME 中)覆盖。

如果项目依赖于现有的合并顺序,这可能会导致行为更改。如果您有一个涉及合并配置数组的环境,请考虑使用 nightly 测试您的项目,以确保它在此更改稳定后继续工作。如果您遇到问题,请提交一个 issue

此更改已包含在从 nightly-2023-08-24 工具链开始的 Cargo 中。

合并顺序

之前的合并顺序未指定,但实际上是以下顺序,较早的条目出现在数组的前面

  • 当前目录中的 config.toml
  • 父目录中的 config.toml
  • $CARGO_HOME 中的 config.toml
  • 命令行 (--config)
  • 环境变量 (CARGO_*)

新的合并顺序是

  • $CARGO_HOME 中的 config.toml
  • 父目录中的 config.toml
  • 当前目录中的 config.toml
  • 环境变量 (CARGO_*)
  • 命令行 (--config)

实现位于 cargo#12515 中。

受影响的配置设置

以下配置设置具有受此更改影响的字符串数组

示例

以下示例说明了此更改如何影响您以及我们为什么进行此更改。

在您的 Cargo 主目录(通常是 ~/.cargo/config.toml)中具有以下内容

[build]
rustflags = ["-C", "target-cpu=x86-64-v2"]

然后在项目目录内有一个 .cargo/config.toml 配置文件,其中包含

[build]
rustflags = ["-C", "target-cpu=x86-64-v3"]

当您在该项目内运行 cargo build 时,cargo 之前会合并这些,以便将 -C target-cpu=x86-64-v3 -C target-cpu=x86-64-v2 传递给 rustc。因为 rustc 会忽略命令行中较早的选项,并且只接受最后一个选项,所以结果最终会使用 x86-64-v2。这实际上会导致当前目录中合并的配置设置被忽略。

这不是预期的行为,因为配置合并应该始终从最低优先级(Cargo 主目录中的内容)开始,并让更具体的配置位置覆盖这些内容。