[英]Why we need to specify all dependencies (including transitives) in Rust?
例如,我的项目依赖于 crate A
, A
依赖于B
,然后我的项目不能使用 crate B
,直到我将B
放入项目的Cargo.toml
的依赖项部分。
在 Java 如果你使用 Maven 或 Gradle,你可以直接使用 B 而不需要在pom.xml
或build.gradle
中声明它。 为什么货物不走那条路?
原因是 semver 兼容性。
例如,假设你的 crate 依赖于版本为 1.0 的A ,而依赖于版本为 1.0 的B :
your_crate --> A 1.0 --> B 1.0
your_crate --> A 1.1 --> B 2.0
问题是,如果您能够传递地访问依赖项,您的代码就会中断,因为B 2.0 与B 1.0 不兼容。
有两种解决方案:
A的维护者可以重新导出B中的所有内容:
// crate a pub use b;
与 Java 一样,这允许您访问传递依赖项B的项目:
// your crate use a::b;
但是,这意味着A不能在B中发布包含主要版本提升的次要版本。 所以当B发布 2.0 版本时, A也必须发布一个新的主要版本。
您也可以依赖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.