我有一系列依赖关系,它们依赖于可选在不推荐使用的库上。具体来说,我想使用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文件以引用所有本地依赖项的替代方法,但是如果可能的话,我想要一种更易于维护的方法来执行此操作。
答案 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的代码我不认为这是一个错误,只是缺乏功能或设计决策。 (毕竟,在一般情况下,弄乱像这样的依赖关系并不是一个好主意。)