想象一下,我正在研究MyCrate
,这取决于 crate A
,它具有默认功能X
。
如果我用--no-default-features
编译MyCrate
$ ,板条箱A
仍然是在启用功能X
的情况下构建的。
这很烦人,但可以通过使用 Cargo.toml 来解决,例如:
[dependencies.A]
version = "*"
default-features = false
但是,当A
依赖于另一个具有自己的默认功能的箱B
时,此解决方案不起作用。 在这种情况下,似乎无法禁用B
的默认功能。 换句话说,似乎不可能禁用间接依赖的默认功能。
我的特别激励案例是libc 在通过 cargo 使用时不必要地依赖于 libstd 。
这就是为什么 Cargo 允许您从主 crate 本身的依赖项中重新导出功能。 依赖项旨在成为私有实现细节而不是公共接口,如果您希望导出该功能,那么您必须明确选择这样做。
@alexcrichton :
那么每个 crate 是否应该包含[dependencies.*] default-features = false
以便最终用户可以选择退出某些嵌套功能? 这似乎相当迟钝。
是的,这就是意图。 将某些东西设为default
功能意味着它将几乎一直打开,因此它不一定适用于所有可选功能。
最有用的评论
@alexcrichton :
那么每个 crate 是否应该包含
[dependencies.*] default-features = false
以便最终用户可以选择退出某些嵌套功能? 这似乎相当迟钝。