通过分叉并使用一些代码,我注意到Cargo可以在同一项目中下载并捆绑同一板条箱的多个版本(例如,native-tls 0.1.5和0.2.1)。通过查看错误版本的文档,我浪费了很多时间。
我一直在寻找有关此行为的一些信息,但找不到任何东西。在某处有记录吗?
是否有一种简单的方法来确定/检测您正在使用的代码(当前编辑的文件)所使用的版本?还是如果需要两个版本相同的板条箱,我们可以告诉Cargo显示一些警告/防止构建吗?
答案 0 :(得分:4)
在设计Rust以允许同一箱子的多个版本时,这是一个明智的决定。
您之前可能已经听说过Dependency Hell,这是在2个(或更多)依赖项A和B具有共同的依赖项C,但每个版本都要求彼此不兼容的情况下发生的。
Rust旨在确保这不会成为问题。
通常,货物将尝试找到满足所有要求的通用版本。只要板条箱作者正确使用SemVer,并且要求有足够的回旋余地,就可以成功计算并使用依赖项的单个版本。
但是,有时需要具有相同依赖项的多个版本,例如在您的情况下,因为0.1.x和0.2.x被视为两个不同的主要版本。在这种情况下,Rust具有两个功能,以允许在同一二进制文件中使用两个版本:
Foo
视为不同类型。当然有一个限制。如果A的函数返回C::Foo
的实例,而您尝试将其传递给B的函数,则编译器将拒绝它(它认为这两种类型是不同的)。这是一个棘手的问题 1 。
任何时候,对C的依赖是内部的,或者对C的使用是孤立的,否则它将自动运行。如您的经验所示,它是如此无缝,以至于用户甚至可能没有意识到它正在发生。
1 请参见dtolnay trick,板条箱作者可以使用它们来允许某些类型的数据互换。
答案 1 :(得分:2)
货物确实可以链接某个板条箱的多个版本,但是这些版本中只有一个可以直接依赖。其他是间接引用。
直接引用始终是Cargo.toml
所引用的版本,位于Cargo.lock
的顶层(而间接引用位于dependencies
小节中)。
不幸的是,我不确定有多少文件记录。