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

Rust 是否可以在Cargo.toml中为依赖项中的功能指定版本?,rust,rust-crates,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 这是否意味着只有两种方法可以解决这个问题: 我降级了我的包中的版本 条形码依赖项得到更新 否,无法为依赖

例如,我使用条形码机板条箱:

barcoders = {version = "0.10.0", features = ["image",]}
是否可以指定此依赖项应使用的映像版本

差不多

barcoders = {version = "0.10.0", features = ["image=0.22.3",]}
因为它使用图像板条箱版本
0.18.0
,在我的项目中,我使用最新的
0.22.3

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

  • 我降级了我的包中的版本
  • 条形码依赖项得到更新

  • 否,无法为依赖项的(可选)依赖项指定版本。这是有意义的,因为您的依赖项只针对他们在
    Cargo.toml
    中指定的版本运行测试。在这种情况下,由于您所做的一切似乎都是使用开源的,您可以使用fork
    barcoders
    ,更新依赖项,运行测试套件,如果通过,则使用fork。在这种情况下,提出问题也是礼貌的


    如果
    barcoders
    不是开源的,因此您无法使用它,那么最好切换到
    barcoders
    使用的
    image
    版本。如果您的板条箱是一个库,那么公开一个使用过时库的公共界面可能会很烦人,但这就是生活。这个问题的“正确”解决方案是等到image有了一个
    1.0
    版本,这基本上是一个向前兼容的承诺,然后
    barcoder
    可以指定
    image=“^1”
    (即>=1.0.0不,你不能,也不应该,也不应该担心

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

    这是一个开源的世界,所以你可以这样做,并在原始板条箱中发布一个拉取请求以进行更新。这可能是值得赞赏的,但不要低估了在这样做时你自己不破坏他人板条箱所需要的小心。 或者制作自己的箱子叉,只为自己更新


    但您可能只是担心在编译过程中看到相同板条箱的不同版本的副本。Cargo确实使用不同的版本进行编译,因此对依赖板条箱的所有调用都将收到开发人员在编写时所期望的结果。这不是性能问题,也不是最终在二进制。别担心。

    功能名称与依赖项名称是分开的,因此不,您不能为它们指定版本。它们也总是可添加的,即如果有多个板条箱依赖于同一版本的板条箱
    foo
    ,并且其中一个启用了功能
    bar
    ,您将得到一个版本的
    foobar
    的代码>。通常,项目中有多个版本的
    图像
    板条箱不是问题。如果
    条码机
    在其外部界面中使用来自
    图像
    板条箱的类型,则可能会出现问题。