货物功能是否可以删除依赖项?

6 dependency-management rust rust-cargo rust-no-std

我希望增加在没有标准库的情况下使用我的板条箱的可能性。一些核心功能确实依赖于浮点函数,这些函数在 no-std 模式下需要由 libm 提供。

我见过的无标准设置的通常方法是使用一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能能够删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致一个问题,即我有某些功能很难在无标准模式下实现,所以我希望它们依赖于启用标准。

货物是否可以指定仅在未启用功能时才存在的可选依赖项?

kmd*_*eko 2

不,Cargo 功能无法删除依赖项。

可以指定optional = true不包含的依赖项,除非通过功能启用,但该机制无法禁用依赖项。请参阅Cargo Book 中的可选依赖项了解其工作原理。货物功能通常被设计为可附加的,因此添加一项功能通常不应删除功能。

您的用例有点不符合规范,因此您最好的路线是遵循@Masklinn 的建议并创建“互斥”功能(不受官方支持):

  • 具有"std""libm"功能,使得该"libm"功能启用 libm 依赖项

    [features]
    default = ["std"]
    std = []
    libm = ["dep:libm"]
    
    [dependencies]
    libm = { version = "*", optional = true }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果两者都启用,则触发编译器错误:

    #[cfg(all(feature = "std", feature = "libm"))]
    compile_error!("features \"std\" and \"libm\" cannot be enabled simultaneously")
    
    Run Code Online (Sandbox Code Playgroud)

仍然不理想,因为 Cargo 功能通常被设计为附加功能,并且由于功能统一,两者可能会无意中启用,但至少上面的编译器错误消息应该有所帮助。