默认情况下是否启用可选依赖项?

Do optional dependencies get enabled by default?

如果我定义一个像 foo = { version = "1.0.0", optional = true } 这样的依赖项, 当我 "cargo run" 时它会可用吗?我可以检查它是否在代码中启用吗?

if cfg!(feature = "foo") {}

似乎没有用,好像一直缺少该功能。

将 60258216 的答案移至此处:

可选依赖项兼作功能:

默认情况下不会启用它们 unless they're listed in the default feature,但您可以使用 cargo run --features foo.

启用该功能

为了清晰和前向兼容性,您可能希望创建一个启用依赖项的实际功能,这样如果您将来需要 "fluff up" 该功能并且需要新的可选依赖项,它会容易得多。

在代码中,#[cfg]cfg! 都应该起作用,具体取决于您是想在编译时还是在运行时检查它。

测试也不难:

[package]
name = "testx"
version = "0.1.0"
edition = "2018"

[features]
default = ["boolinator"]
magic = ["boolinator"]
empty = []

[dependencies]
boolinator = { version = "*", optional = true }

和 main.rs 的:

fn main() {
    # macro and attributes would work the same here
    if cfg!(feature = "boolinator") {
        println!("Hello, bool!");
    } else {
        println!("Hello, world!");
    }
}

你得到

$ cargo run -q
Hello, bool!
$ cargo run -q --no-default-features
Hello, world!
$ cargo run -q --no-default-features --features boolinator
Hello, bool!
$ cargo run -q --no-default-features --features magic
Hello, bool!
$ cargo run -q --no-default-features --features empty
Hello, world!

另见 https://github.com/rust-lang/edition-guide/issues/96