我希望添加在没有标准库的情况下使用我的板条箱的可能性。一些核心功能确实依赖于浮点函数,在无标准模式下需要由 libm 提供。
我见过的无标准设置的通常方法是使用一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能能够删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致一个问题,即我有某些功能很难在无标准模式下实现,所以我希望它们依赖于启用标准.
货物是否可以指定仅在未启用功能时才存在的可选依赖项?
不,Cargo 功能无法删除依赖项。
可以使用
optional = true
指定依赖关系,除非通过功能启用,否则不会包含依赖关系,但该机制无法禁用依赖关系。请参阅 Cargo Book 中的可选依赖项了解其工作原理。货物功能通常被设计为可添加的,因此添加一项通常不应删除功能。
您的用例有点不规范,因此您最好的路线是遵循@Masklinn的建议并创建“互斥”功能(不受官方支持):
具有
"std"
和 "libm"
功能,使得 "libm"
功能启用 libm 依赖项
[features]
default = ["std"]
std = []
libm = ["deb:libm"]
[dependencies]
libm = { version = "*", optional = true }
如果两者都启用,则会触发编译器错误:
#[cfg(all(feature = "std", feature = "libm"))]
compile_error!("features \"std\" and \"libm\" cannot be enabled simultaneously")
仍然不理想,因为 Cargo 功能通常被设计为可附加的,并且由于功能统一,两者可能会无意中启用,但至少上面的编译器错误消息应该有所帮助。