我有兩個特點:feature_1
和feature_2
:如何讓兩個功能啓用導致Rust中的衝突?
[features]
default = ["feature_1"]
feature_1 = []
feature_2 = []
我希望讓用戶只選擇其中的一個在同一時間,因爲兩者在同一時間選擇會導致一些重要的代碼複製,並通過一些其他原因。我怎樣才能做到這一點?
我有兩個特點:feature_1
和feature_2
:如何讓兩個功能啓用導致Rust中的衝突?
[features]
default = ["feature_1"]
feature_1 = []
feature_2 = []
我希望讓用戶只選擇其中的一個在同一時間,因爲兩者在同一時間選擇會導致一些重要的代碼複製,並通過一些其他原因。我怎樣才能做到這一點?
基本上,你不能。貨物特徵是可加性的,並且特徵可以由依賴關係樹中的任何貨箱啓用。貨運方面有一個隱含的假設,即總是有效啓用附加功能。
更重要的是,功能不是簡單的請求,他們是要求。如果一個箱子要求feature_1
,而另一個箱子要求feature_2
,則你有兩個箱子不能一起工作。 Cargo(和Rust本身)會花費一些時間來嘗試使這種情況難以創建。
最好的解決方案是改變你的箱子的寫法,使兩個特徵可以同時啓用。如果這真的不可能,那麼最好的辦法是防止編譯成功。這可以通過您的箱子的構建腳本來完成,該腳本可以檢測到不兼容的功能並且失敗,或者通過將非編譯代碼放置在僅在啓用不兼容功能時啓用的箱子中。
當你訪問這兩個功能很快就會被一個額外的宏支持時,使你不能編譯:compile_fail! https://github.com/rust-lang/rust/pull/42620 – Skade
爲什麼你不能只是有條件地編譯一個名爲'YouMayOnlyUseOneOfFeatureAOrFeatureB'的類型?如果兩個功能都啓用,代碼將無法編譯。 – Shepmaster
@Shepmaster:「...或通過將非編譯代碼放入您的箱子中,該箱子僅在啓用不兼容的功能時啓用。」 –
相關:https://github.com/rust-lang/cargo/issues/2980 – Boiethios