根据依赖关闭默认功能

时间:2018-02-08 04:04:57

标签: rust rust-cargo

我有一系列依赖关系,它们依赖于可选在不推荐使用的库上。具体来说,我想使用nalgebra,它间接依赖于rustc-serialize如下:

nalgebra - >藻类 - > num-complex - > (可选默认值)rustc-serialize

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

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

2 个答案:

答案 0 :(得分:5)

作为H2O states,这是不可能的,但请检查他们的答案,找到一个好的临时解决方法,让事情再次发挥作用。我想讨论为什么不应该可行以及长期解决方案是什么。

一般情况下,你不能告诉crate使用依赖项。 alga 完全可以在内部使用 num-complex 的rustc-serialize功能。

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

要么您最终能够向项目提交PR以改善每个人的案例,或者您将理解为什么您认为可选的实际上并非如此。

答案 1 :(得分:3)

我很确定目前无法做到这一点。我考虑使用Cargo的[patch] section进行此操作,但看起来您实际上无法在补丁部分中指定功能,但只能覆盖给定依赖项的路径或git url。

但是,使用此部分可以使您的解决方法更整洁。只需fork num-complex并从默认值中删除rustc-serialize功能。使用货物贴片为您提供这样的叉子:

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

这样你的fork就会在依赖链中一直使用,而不必单独更改每个包。

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