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

问题描述 投票:0回答:1

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

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

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

rust dependency-management rust-cargo rust-no-std
1个回答
0
投票

不,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 功能通常被设计为可附加的,并且由于功能统一,两者可能会无意中启用,但至少上面的编译器错误消息应该有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.