Включены ли необязательные зависимости по умолчанию? - PullRequest
0 голосов
/ 17 февраля 2020

Если я определю зависимость типа foo = { version = "1.0.0", optional = true }, будет ли она доступна, когда я выполню команду "car go run"? Могу ли я проверить, включен ли он в коде?

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

Не похоже, что он работает, как будто функция постоянно отсутствует.

1 Ответ

2 голосов
/ 17 февраля 2020

Перемещение ответа на 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

...