【问题标题】:Include dependency of optional dependency包含可选依赖的依赖
【发布时间】:2021-08-28 22:34:12
【问题描述】:

在 Rust Cargo 中,如何根据包含另一个依赖项来包含依赖项的可选功能?

具体来说,我想提供一个“serde”功能,它可以支持 serde。我能做的是[1]

[dependencies]
serde = { version = "1.0", optional = true }

Rust 会自动将此依赖项导出为功能(据我了解)。 但是,我使用其他依赖项,它们也提供“serde”功能:

[dependencies]
otherpackage = { version = "1.0", features = ["serde"] }
serde = { version = "1.0", optional = true }

现在,只有在为此包激活了“serde”功能时,才应包含“otherpackage”的 serde 功能。但是货物不让我做

[features]
serde = [ "serde", "otherpackage/serde" ]

[dependencies]
otherpackage = { version = "1.0" }
serde = { version = "1.0", optional = true }

我知道这是由于“serde”功能和“serde”依赖项之间的名称冲突,我认为它也作为功能导出。所以,本质上现在有两个“serde”功能,这显然是行不通的。

如何在仍然提供“serde”功能且不重命名“serde”包的情况下解决此问题?理想情况下,我只想禁用 serde 依赖项作为功能的自动导出,或者能够指定“serde”包的功能依赖项。

【问题讨论】:

    标签: rust-cargo


    【解决方案1】:

    如何在仍然提供“serde”功能且不重命名“serde”包的情况下解决此问题?

    Cargo 当前正在运行 namespaced features,它允许您拥有名为 serde 的功能和名为 serde 的依赖项而不会发生冲突。这还不是一个稳定的功能。

    目前,唯一稳定的方法是重命名“serde”依赖项。但是,这不需要破坏其他任何东西;如“Advanced Cargo [features] Usage” 中所述,您可以重命名它并重命名它返回。像这样设置您的 Cargo.toml:

    [features]
    serde = [ "serde_cr", "otherpackage/serde" ]
    
    [dependencies]
    otherpackage = { version = "1.0" }
    serde_cr = { package = "serde", version = "1.0", optional = true }
    

    这将使 crate 名称 serde_cr 对您的代码可见。然后在lib.rs 中使用显式的extern crate 将其重命名:

    extern crate serde_cr as serde;
    

    【讨论】:

    • 谢谢。我不知道是否可以在 lib.rs 中重命名 crate。然而,在使用derive(Deserialize) 时,这个解决方案似乎需要一个丑陋的hack,因为rustc 抱怨它can't find crate for "serde"。在每个derive(Deserialize) 下方使用#[serde(crate = "serde")] 可以解决问题:how to reexport Serialize, Deserialize?
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2013-11-05
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多