繁体   English   中英

为什么我们需要在 Rust 中指定所有依赖(包括传递)?

[英]Why we need to specify all dependencies (including transitives) in Rust?

例如,我的项目依赖于 crate AA依赖于B ,然后我的项目不能使用 crate B ,直到我将B放入项目的Cargo.toml的依赖项部分。

在 Java 如果你使用 Maven 或 Gradle,你可以直接使用 B 而不需要在pom.xmlbuild.gradle中声明它。 为什么货物不走那条路?

原因是 semver 兼容性。

例如,假设你的 crate 依赖于版本为 1.0 的A ,而依赖于版本为 1.0 的B

your_crate  -->  A 1.0  -->  B 1.0
  • 现在, B发布了一个与 1.0 版本不兼容的新版本 2.0。
  • A升级到B版本 2.0 并发布次要版本 1.1。 这个版本与 1.0 兼容,尽管它的依赖关系不是。
  • 您升级到A版本 1.1。
your_crate  -->  A 1.1  -->  B 2.0

问题是,如果您能够传递地访问依赖项,您的代码就会中断,因为B 2.0 与B 1.0 不兼容。


有两种解决方案:

  1. A的维护者可以重新导出B中的所有内容:

     // crate a pub use b;

    与 Java 一样,这允许您访问传递依赖项B的项目:

     // your crate use a::b;

    但是,这意味着A不能在B中发布包含主要版本提升的次要版本。 所以当B发布 2.0 版本时, A也必须发布一个新的主要版本。

  2. 您也可以依赖B 这意味着 Cargo 将尝试选择同时满足A和您的箱子要求的B版本。 如果不能,则包括B的几个版本:

     your_crate --> A 1.1 --> B 2.0 --> B 1.0

例如,我的项目依赖于 crate A,A 依赖于 B,那么我的项目不能使用 crate B,直到我将 B 放入我项目的 Cargo.toml 的依赖项部分。

In java if you're using maven or gradle, you can directly use B and don't need to declare it in the pom.xml or build.gradle. 为什么货物不走那条路?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM