如何使启用的两个功能导致 Rust 中的冲突?

How can I make two features enabled lead to a conflict in Rust?

我有两个特征:feature_1feature_2:

[features]
default = ["feature_1"]
feature_1 = []
feature_2 = []

我想让用户一次只选择其中一个,因为同时选择两个会导致一些重要代码的重复以及其他一些原因。我该怎么做?

从根本上说,你不能。 Cargo 特性是附加的,特性可以由依赖树中的任何板条箱启用。 Cargo 有一个隐含的假设,即始终 有效以启用附加功能。

此外,功能不仅仅是请求,它们是需求。如果一个 crate 需要 feature_1,而另一个 crate 需要 feature_2,那么两个 crate 不可能一起工作。 Cargo(和 Rust 本身)竭尽全力尝试让这种情况难以产生。

最好的解决方案是更改您的 crate 的编写方式,以便可以同时启用这两个功能。如果那真的不可能,那么您能做的最好的事情就是阻止编译成功。这可以通过为您的 crate 构建脚本来检测不兼容的功能并失败,或者通过将非编译代码放入您的 crate 中来完成,该代码仅在启用不兼容的功能时才启用。

为了它的价值,我选择使用这种方法:

#[cfg(all(feature = "feature_1", feature = "feature_2"))]
compile_error!("Feature 1 and 2 are mutually exclusive and cannot be enabled together");

我希望它能帮助其他人寻找相同问题的解决方案。