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 主目录中的内容)开始,并让更具体的配置位置覆盖这些内容。