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

时间:2019-11-27 21:08:47

标签: rust rust-crates

例如,我使用条形码箱:

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. Barcoders依赖关系得到更新

2 个答案:

答案 0 :(得分:2)

否,无法为依赖项(可选)的依赖项指定版本。这很有道理,因为您的依赖项仅针对他们在Cargo.toml中指定的版本运行测试。在这种情况下,由于您所做的一切都使用开源,因此您可以派生barcoders,更新依赖项,运行测试套件,如果通过了,请使用您的派生。在那种情况下打开一个问题也是礼貌的。

如果barcoders不是开源的,那么您就无法派生它,最好的选择是切换到image使用的barcoders的版本。如果您的箱子是一个库,那么公开使用过时库的公共接口可能会很烦人,但这就是生活。解决此问题的“适当”方法是等待映像发布1.0,这基本上是向前兼容的承诺,然后barcoders可以指定image = "^1"(即> = 1.0.0) <2.0.0)。我之所以提到此“解决方案”,只是因为您似乎对barcoders拥有提交特权,实际上,您通过更新image中的barcoders依赖关系解决了自己的问题。

正如评论中指出的那样,此版本兼容性问题不像最初看起来的那么脆弱。只要来自某个依赖箱的不同版本的类型不跨越api边界,您的项目就可以同时包含该依赖项的任何数量的版本。使用多个版本的库需要rust团队在name mangling上进行一些工作,您可以阅读有关here

的信息。

答案 1 :(得分:1)

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

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

这是开源世界,因此您可以这样做,并在原始板条箱中发布拉取请求以进行更新。可以理解,但是不要低估在这样做时要注意不要破坏他人的板条箱。 或自己制作一个专门为您更新的板条箱。

但是您可能只是担心在编译过程中会看到具有不同版本的同一板条箱的重复。 Cargo确实可以使用不同的版本进行编译,因此对依赖板条箱的所有调用都将收到开发人员在编写时所期望的内容。这在性能上或最终在二进制文件中的指令数量方面都不是问题。别担心。