代码之家  ›  专栏  ›  技术社区  ›  yageek

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

  •  2
  • yageek  · 技术社区  · 7 年前

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

    我想知道一些关于这种行为的信息,但什么也找不到。这有什么记录吗?

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jan Hudec    7 年前

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

    直接引用总是引用的版本 Cargo.toml 在最高层 Cargo.lock (当间接引用在 dependencies 小节)。

    不幸的是,我不知道有多少记录。

        2
  •  6
  •   Matthieu M.    7 年前

    这是一个有意识的决定,当设计锈允许同一个板条箱的多个版本。

    你可能听说过 Dependency Hell 以前,当2个(或更多)依赖项A和B具有共同的依赖项C,但每个依赖项都需要一个与另一个不兼容的版本时发生。

    生锈是为了确保这不会成为一个问题。

    一般来说,货物将试图找到一个满足所有要求的通用版本。只要crate作者正确地使用SemVer,并且需求提供了足够的回旋余地,就可以成功地计算和使用单一版本的依赖项。

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

    • 每个版本的唯一散列将附加到每个符号。
    • 类型系统考虑同一类型 Foo 从两个版本的C到不同的类型。

    当然,这是有限制的。如果的函数返回 C::Foo 如果试图将它传递给B的函数,编译器将拒绝它(它认为这两种类型不同)。这是个棘手的问题 .

    只要对C的依赖是内部的,或者C的使用是独立的,它就会自动工作。如您的经验所示,它是如此无缝,用户甚至可能没有意识到它正在发生。

    dtolnay trick 板条箱的作者可以使用它来允许某些类型可以互换。