在 dependency 中关闭 default-features

Turn off default-features in dependency of dependency

我有一个依赖链,最终依赖于 可选地 一个已弃用的库。具体来说,我想使用间接依赖于 rustc-serialize 的 nalgebra,如下所示:

nalgebra -> alga -> num-complex -> (可选默认)rustc-serialize

我可以在我的 Cargo.toml 文件中列出 num-complex 依赖项并关闭可选的 rustc-serialize 依赖项(num-complex = { version = "0.1.42", default-features = false }),但是有没有办法关闭这个选项所有的Cargo.toml?

我尝试了一种替代方法,即克隆其中的每一个并操作本地副本的 Cargo.toml 文件以引用所有本地依赖项,这可行,但我想要一种更易于维护的方法来执行此操作,如果可能的。

我相当确定这目前是不可能的。我研究了用 Cargo 的 [patch] section 来做这个,但看起来你实际上不能在补丁部分指定功能,而只能覆盖路径或 git url给定的依赖项。

但是,使用此部分可以使您的解决方法更简洁一些。只需 fork num-complex 并从默认值中删除 rustc-serialize 功能。使用 cargo-patch 像这样提供你的叉子:

[patch.crates-io]
num-complex = { git = "https://github.com/your-github-name/num-complex.git" }

这样你的叉子将在依赖链中一直使用,而不必单独更改每个板条箱。

正如我之前提到的,在本节中指定 default-features = false 似乎没有任何作用。通过查看 Cargo 的代码,我认为这不是错误,只是缺少功能或设计决策。 (毕竟,在一般情况下,像这样搞乱依赖关系并不是一个好主意)。

作为 ,这是不可能的,但请检查他们的答案以获得良好的临时解决方法,以使事情再次发生。我想讨论一下为什么 不应该 可行以及长期解决方法是什么。

一般来说,您无法判断 crate 使用依赖项的目的。 alga 完全有可能在内部使用 num-complex 的 rustc-serialize 功能。

正确的做法是向上跟踪依赖链。转到每个项目并添加一个功能,以选择加入其直接依赖项的 rustc-serialize 功能。您还可以将 rustc-serialize 功能添加到默认功能以保持向后兼容性。

要么你最终能够向项目提交 PR 以改进每个人的案例,要么你会明白为什么你认为是可选的实际上不是。