包含可选依赖的依赖

Include dependency of optional dependency

在 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 }

现在,“otherpackage”的 serde 特性只有在为这个包激活了“serde”特性时才应该包含在内。但是cargo不让我做

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

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

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

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

How can I solve this with still offering a "serde" feature and without renaming the "serde" package?

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;