gpt4 book ai didi

rust - 为什么添加 byteorder 会使 Cargo 将 mysql 降级到 8.0.0 版本?

转载 作者:行者123 更新时间:2023-11-29 08:18:46 27 4
gpt4 key购买 nike

我用 Rust 开发一个项目已有一段时间了。几天前,我运行了 cargo update,我的一大堆依赖项都被降级了,但我一直无法弄清楚原因。我创建了一个新项目,发现如果 Cargo.toml 中的依赖项只是

[dependencies]
mysql = "*"

如我所料,它使用最新的 mysql (11.3.0) 构建。如果我添加

byteorder = "1"

然后运行 ​​cargo clean/cargo updatemysql 降级到 8.0.0。

任何帮助弄清楚为什么 byteorder 依赖性导致 Cargo 降级 mysql 或如何阻止它这样做的帮助将不胜感激。

最佳答案

how to stop it from doing so

这是简单的部分:不要使用通配符版本。您的代码字面上任何已发布的 crate 版本的机会平均为零。

why the byteorder dependency is making Cargo downgrade mysql

这实际上真的很难回答。选择依赖项 is an NP-hard problem .由于大多数程序员不在乎等待那么久,因此每个依赖项管理器中都有试探法、偏好和捷径。我不知道 Cargo 算法的所有细微差别,所以大部分都是有根据的猜测或调查。

您通过 mysql = "*" 告诉 Cargo “我不关心使用什么版本的 mysql”。 Cargo 现在可以自由使用它想要的任何版本,这是一个非常灵活的要求。

在这种情况下,mysql 11.3.0 has chosen to require byteorder = "~1.0" .那允许字节顺序 1.1.0。依赖项解析的某些方面看到了这一点,并表示最好让您的 crate 具有字节顺序的 1.1.0 版本,即使这意味着需要将 mysql 降级为非冲突版本。重要的是 8.0.0 版本是最后一个只需要字节顺序 0.5.3 的版本。

如果您尝试将两者都强制为当前版本,您将看到:

error: failed to select a version for `byteorder` (required by `mysql`):
all possible versions conflict with previously selected versions of `byteorder`
version 1.1.0 in use by byteorder v1.1.0
possible versions to select: 1.0.0

但是,您可以获得几乎完全更新:

[dependencies]
mysql = "11.3.0"
byteorder = "1.0.0"

我不完全确定为什么 Cargo 允许您同时拥有版本 1.1 和 0.5 而不是 1.1 和 1.0,但我的猜测是启发式方法是给定 crate 只有一个语义主要版本。

Cargo 的 future 增强可能会引入 "public" and "private" dependencies 的概念,这可能会改变解析算法并使这种情况更好,因为字节顺序可能是 mysql 的内部依赖项,您不需要匹配它。

关于rust - 为什么添加 byteorder 会使 Cargo 将 mysql 降级到 8.0.0 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com