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

yag*_*eek 3 rust rust-cargo

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

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

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

Mat*_* M. 6

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

您可能以前曾听说过“ 依赖关系地狱”,这是在2个(或更多)依赖关系A和B具有共同的依赖关系C时发生的,但是每个要求的版本都彼此不兼容。

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

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

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

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

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

每当对C的依赖是内部的,或者对C的使用被隔离时,它都会自动起作用。如您的经验所示,它是如此无缝,以至于用户甚至可能没有意识到它正在发生。

1 请参阅dtolnay技巧,板条箱作者可以使用dtolnay技巧允许某些类型互换。