Перемещение ответа на 60258216 здесь:
Необязательные зависимости удваиваются как функции: { ссылка }
Они не будут включены по умолчанию , если они не ' перечислены в default
функция , хотя вы можете включить функцию с помощью cargo run --features foo
.
Для ясности и прямой совместимости вы можете создать фактическую функцию, которая позволяет зависимость, однако, таким образом если в будущем вам понадобится «взбить» эту функцию, а это потребует новых дополнительных зависимостей, это будет намного проще.
В коде и #[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