是否可以为 Cargo.toml 中依赖的功能指定版本?

Is it possible to specify version for feature in dependency in Cargo.toml?

例如,我使用条形码箱:

barcoders = {version = "0.10.0", features = ["image",]}

是否可以指定此依赖项应使用哪个版本的图像?

类似于

barcoders = {version = "0.10.0", features = ["image=0.22.3",]}

因为它使用图像箱版本 0.18.0 并且在我的项目中我使用最新的 0.22.3.

是否意味着只有两种方法可以解决:

  1. 我在我的包中降级版本
  2. 条码器依赖项得到更新

不,无法为依赖项的(可选)依赖项指定版本。这是有道理的,因为您的依赖项 运行 他们只针对他们在 Cargo.toml 中指定的版本进行测试。在这种情况下,因为看起来你所做的一切都使用开源,你可以 fork barcoders,更新依赖,运行 测试套件,如果它通过,使用你的 fork。在这种情况下打开一个问题也是有礼貌的。

如果 barcoders 不是开源的,所以您不能分叉它,最好的办法是切换到 barcoders 使用的 image 版本。如果你的 crate 是一个库,暴露一个使用过时库的 public 接口可能会很烦人,但这就是生活。 "proper"解决这个问题的方法是等image有1.0发布,这基本上是一个向前兼容的承诺,然后barcoders可以指定image = "^1"(即>=1.0 .0 <2.0.0)。我提到这个 "solution" 只是因为你似乎对 barcoders 有提交权限,实际上你通过更新 barcoders.[=22= 中的 image 依赖项解决了你自己的问题]

正如其中一条评论所指出的,此版本兼容性问题并不像乍看起来那么脆弱。只要来自某些依赖包的不同版本的类型不跨越 api 边界,您的项目就可以同时包含该依赖项的任意数量的版本。使用多个版本的库需要 Rust 团队在 name mangling, which you can read about here

上做一些工作

不,你不能,也不应该,也不应该担心。

库是在单个时间点开发的,使用具有特定 API 的依赖项。依赖关系可能会改变主要版本之间的某些依赖关系(改变函数的类型 returns,公开不同的模式,等等)。这可能使其无法再编译。要真正更新某些内容,您可能首先需要更改使用依赖项的部分代码。

这是开源世界,因此您可以这样做并在原始板条箱中发布拉取请求以进行更新。这可能会受到赞赏,但不要低估在这样做时需要注意不要自己打破别人的板条箱。 或者制作你自己的 crate 分支,只为你更新它。

但是您可能只是担心在编译过程中看到具有不同版本的同一个 crate 的副本。 Cargo 确实使用不同的版本进行编译,因此所有对 dependended crate 的调用都将收到开发人员在 he/she 编写它时所期望的内容。这不是性能问题,也不是二进制文件中指令数量的问题。别担心了。