2017-07-14 23 views
1

我一直在Rust开发一个项目。前几天我跑了cargo update,我的一大堆依赖被降级了,我一直无法弄清楚为什么。我创建了一个新的项目,并已发现,如果在Cargo.toml依赖只是为什么添加字节顺序将货物降级到8.0.0版本?

[dependencies] 
mysql = "*" 

它构建了最新mysql(11.3.0),因为我期望的那样。如果我添加

byteorder = "1" 

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

任何帮助搞清楚为什么byteorder依赖正在使货物降级mysql或如何阻止它这样做,将不胜感激。

回答

1

如何从这样

这是比较容易的部分停止:不使用通配符的版本。您的代码与工作的机会几乎为曾经发布过的该工具箱的任何版本平均为零。

为什么字节顺序依赖性使得货物降级MySQL的

这实际上是真的很难回答。采摘依赖is an NP-hard problem。由于大多数程序员并不在意等待那么长时间,所以每个依赖管理者都有启发式方法和首选项以及快捷方式。我不知道货物算法的所有细微差别,所以大部分是受过教育的猜测或调查。

你已经告诉货物“我不在乎使用哪个版本的mysql”说mysql = "*"。 Cargo现在可以自由使用任何想要的版本,这是一个非常灵活的要求。

在这种情况下,mysql 11.3.0 has chosen to require byteorder = "~1.0"。那不是允许字节顺序1.1.0。依赖关系解析的某些方面看到了这一点,并且表示最好允许您的箱子拥有版本1.1.0的byteorder,即使这意味着需要将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,但我的猜测是启发式是只有一个给定箱子的语义主版本。

对货运的未来增强可能会引入"public" and "private" dependencies的概念,这可能会改变分辨率算法以及使这种情况更好,因为字节顺序可能是mysql的内部依赖关系,您不需要匹配它。

+0

谢谢,那钉了它。事实上,如果我明确地在Cargo.toml中设置mysql版本而不将字节顺序依赖关系更改为1.0,那么货物更新就会坐下来旋转CPU,因为它试图找到依赖冲突的解决方案。几分钟后我杀了它,所以我不知道它是否最终会放弃。 –

+0

@DanielHarding你的意思是'mysql =“11.3.0”byteorder =“1”'?我不能说这是一个错误或任何东西,但我鼓励你报告任何需要那么长时间的事情。我期望的一个启发式就是在一段时间后停止搜索。 – Shepmaster

+0

现在我无法再现它:-(如果它再次出现,我可以制作一个可重复的测试用例,我一定会报告它。 –