默认情况下是否启用可选依赖项?
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!
如果我定义一个像 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!