У меня есть проект Rust, который имеет структуру:
- main_crate (features = "x")
- driver_crate (features = "x")
- x_crate
...
...
В моем main_crate
у меня есть флаг функции x
, который я включаю по умолчанию и который передается в driver_crate
через следующую настройку в main_crate/Cargo.toml
:
[features]
x = ["driver-crate/x"]
# default = ["x"]
driver_crate/Cargo.toml
определяет зависимость x
как необязательную следующим образом:
[dependencies]
x-crate = { path = "../x-crate", optional = true }
[features]
x = ["dep:x-crate"]
Предположим, что я запускаю cargo build --no-default-features
, я ожидаю, что теперь, когда x
больше не включен по умолчанию, Cargo теперь должен рассматривать зависимость x
как false
и, следовательно, даже не пытаться скомпилировать ее как часть проекта. Вместо этого груз по-прежнему добавляет x_crate
как часть процесса компиляции.
Кроме того, я убедился, что ящик «x» отсутствует в дереве «зависимостей», когда я выполняю следующую команду:
cargo tree -p main_crate | grep "x_crate"
Однако он присутствует, когда я специально включаю x
:
cargo tree -p main_crate -F "x" | grep "x_crate"
│ │ ├── x_crate v0.1.0 (/src/x_crate)
Есть ли способ гарантировать, что x_crate
вообще не компилируется, если функция x
не указана?
Обновление: я понял, почему оно включено в сборник. Мой проект использует виртуальный манифест, в котором указано, что members
рабочей области src/*
автоматически включает x
:
[workspace]
members = [
"src/*",
Как я могу динамически включать/исключать x_crate
в качестве зависимости, когда указываю флаг функции x
в рабочей области?
Являются ли эти ящики частью одного и того же рабочего пространства? Если да, то вы создаете рабочее пространство (с cargo build
в корне) или конкретный проект?
@kmdreko Я пробовал использовать —no-default-features
и закомментировать строку, в которой x
указано по умолчанию, но безрезультатно.
@Cerberus да, все они являются частью одного рабочего пространства. Представленная мной диаграмма пытается проиллюстрировать дерево зависимостей ящиков, хотя я не уверен, что оно было слишком ясным.
@kmdreko В моем конкретном случае использования я тестирую этот проект на машине, которая не поддерживает x
, когда я пытаюсь его скомпилировать, один из сигналов static_assert
указывает на то, что эта конфигурация машины не поддерживается. Я думаю, это хороший показатель того, что крейт компилируется.
@feds01 попробуйте для проверки работоспособности удалить все папки с артефактами сборки и перестроить
@AlexeyS.Larionov Я понял, что он включен, потому что он автоматически указывается в манифесте моей рабочей области независимо от указанного набора функций. Можно ли каким-либо образом указать функции в виртуальном манифесте рабочей области?
Крейт компилируется, поскольку в рабочей области Cargo по умолчанию собирает все пакеты.
Вы можете создать только конкретный пакет (и его зависимости) с помощью cargo build --package <package>
(cargo build -p <package>
) или установить пакет по умолчанию для всех cargo build
через workspace.default-members.
То, что вы говорите, что хотите, чтобы произошло, — то и происходит. Если при построении корневого ящика передается
--no-default-features
, тоx-crate
не строится. Что вы видите, что указывает на то, чтоx-crate
компилируется? Возможно, есть другая зависимость, использующая ее или включающая эту функцию?