2017-06-15 21 views
4

我有两个特点:feature_1feature_2如何让两个功能启用导致Rust中的冲突?

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

我希望让用户只选择其中的一个在同一时间,因为两者在同一时间选择会导致一些重要的代码复制,并通过一些其他原因。我怎样才能做到这一点?

+0

相关:https://github.com/rust-lang/cargo/issues/2980 – Boiethios

回答

4

基本上,你不能。货物特征是可加性的,并且特征可以由依赖关系树中的任何货箱启用。货运方面有一个隐含的假设,即总是有效启用附加功能。

更重要的是,功能不是简单的请求,他们是要求。如果一个箱子要求feature_1,而另一个箱子要求feature_2,则你有两个箱子不能一起工作。 Cargo(和Rust本身)会花费一些时间来尝试使这种情况难以创建。

最好的解决方案是改变你的箱子的写法,使两个特征可以同时启用。如果这真的不可能,那么最好的办法是防止编译成功。这可以通过您的箱子的构建脚本来完成,该脚本可以检测到不兼容的功能并且失败,或者通过将非编译代码放置在仅在启用不兼容功能时启用的箱子中。

+3

当你访问这两个功能很快就会被一个额外的宏支持时,使你不能编译:compile_fail! https://github.com/rust-lang/rust/pull/42620 – Skade

+0

为什么你不能只是有条件地编译一个名为'YouMayOnlyUseOneOfFeatureAOrFeatureB'的类型?如果两个功能都启用,代码将无法编译。 – Shepmaster

+1

@Shepmaster:“...或通过将非编译代码放入您的箱子中,该箱子仅在启用不兼容的功能时启用。” –