是否有文件证明Cargo可以下载并捆绑同一板条箱的多个版本?

时间:2018-08-06 20:02:27

标签: rust rust-cargo

通过分叉并使用一些代码,我注意到Cargo可以在同一项目中下载并捆绑同一板条箱的多个版本(例如,native-tls 0.1.5和0.2.1)。通过查看错误版本的文档,我浪费了很多时间。

我一直在寻找有关此行为的一些信息,但找不到任何东西。在某处有记录吗?

是否有一种简单的方法来确定/检测您正在使用的代码(当前编辑的文件)所使用的版本?还是如果需要两个版本相同的板条箱,我们可以告诉Cargo显示一些警告/防止构建吗?

2 个答案:

答案 0 :(得分:4)

在设计Rust以允许同一箱子的多个版本时,这是一个明智的决定。

您之前可能已经听说过Dependency Hell,这是在2个(或更多)依赖项A和B具有共同的依赖项C,但每个版本都要求彼此不兼容的情况下发生的。

Rust旨在确保这不会成为问题。

通常,货物将尝试找到满足所有要求的通用版本。只要板条箱作者正确使用SemVer,并且要求有足够的回旋余地,就可以成功计算并使用依赖项的单个版本。

但是,有时需要具有相同依赖项的多个版本,例如在您的情况下,因为0.1.x和0.2.x被视为两个不同的主要版本。在这种情况下,Rust具有两个功能,以允许在同一二进制文件中使用两个版本:

  • 每个版本的唯一哈希都附加到每个符号上。
  • 类型系统将两个C版本中的相同类型Foo视为不同类型。

当然有一个限制。如果A的函数返回C::Foo的实例,而您尝试将其传递给B的函数,则编译器将拒绝它(它认为这两种类型是不同的)。这是一个棘手的问题 1

任何时候,对C的依赖是内部的,或者对C的使用是孤立的,否则它将自动运行。如您的经验所示,它是如此无缝,以至于用户甚至可能没有意识到它正在发生。

1 请参见dtolnay trick,板条箱作者可以使用它们来允许某些类型的数据互换。

答案 1 :(得分:2)

货物确实可以链接某个板条箱的多个版本,但是这些版本中只有一个可以直接依赖。其他是间接引用。

直接引用始终是Cargo.toml所引用的版本,位于Cargo.lock的顶层(而间接引用位于dependencies小节中)。

不幸的是,我不确定有多少文件记录。