根据依赖关闭默认功能

bea*_*rdc 3 rust rust-cargo

我有在这取决于最终依赖链可选上弃用库.具体来说,我想使用nalgebra,它间接依赖于rustc-serialize,如下所示:

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文件以引用所有本地依赖项的替代方法,但是如果可能的话,我想要一种更易于维护的方法来执行此操作.

H2O*_*H2O 6

我相当确定目前这是不可能的。我研究过使用 Cargo[patch] 部分来执行此操作,但看起来您实际上无法在补丁部分中指定功能,而只能覆盖给定依赖项的路径或 git url。

但是,使用此部分,您可以使您的解决方法更加简洁。只需分叉 num-complex 并rustc-serialize从默认值中删除该功能即可。使用货物补丁为你的叉子提供如下所示:

[patch.crates-io]
num-complex = { git = "https://github.com/your-github-name/num-complex.git" }
Run Code Online (Sandbox Code Playgroud)

这样,您的分叉将在依赖链中一直使用,而无需单独更改每个箱子。

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


She*_*ter 5

正如H2O所述,这是不可能的,但请检查他们的答案,找到一个好的临时解决方法,让事情再次发挥作用.我想讨论为什么它不应该是可能的,什么长期的修复.

一般来说,你不能告诉crate使用依赖项.alga完全有可能在内部使用num-complex的rustc-serialize功能.

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

要么你最终能够向项目提交PR来改善每个人的情况,要么你会理解为什么你认为可选的实际上不是.