我正在寻找一种方法来提供基于依赖项的特性选择的特殊功能。
有一个库crate-a
具有feature-a
和feature-b
的功能。我想创建一个新的库crate-b
,它依赖于crate-a
。
二进制crate-c
依赖于crate-a
和crate-b
,并指定crate-a
的功能。
我想根据为crate-a
选择的特性集提供crate-b
的函数greet
的不同实现。
我试过这种方法,但不起作用:
// at crate-b/src/lib.rs
#[cfg(not(feature = "crate-a/feature-a"))]
pub fn greet() {
println!("General impl");
}
#[cfg(feature = "crate-a/feature-a")]
pub fn greet() {
println!("Feature-A impl");
}
字符串
有什么方法可以从crate-b
检查crate-a
的功能吗?
我同时控制crate-a
和crate-b
。即使是在crate-a
中需要更改的方法也适用于我。
1条答案
按热度按时间8ehkhllq1#
我能想到的在编译时实现这一点的唯一方法是根据启用的功能在
crate-a
中有条件地定义宏。例如,指定feature-a
时的宏如下所示:字符串
这些宏可以被其他crate使用,但是通过
#[doc(hidden)]
对crate-a
的公共API隐藏,并且它们可以扩展为与它们给定的标记相同的标记或空的主体,这取决于功能标志。然后您可以在crate-b
中使用它们,如下所示:型
这显然是一个非常古怪的解决方案,并且需要为您使用的每个功能标志组合定义大量样板宏,但应该适用于基于
crate-a
功能的编译时条件编译。编辑:作为参考,
serde
在其serde_if_integer128
宏中使用了类似的方法,直到版本1.0.187。