2017-06-15 106 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:「...或通過將非編譯代碼放入您的箱子中,該箱子僅在啓用不兼容的功能時啓用。」 –