Как я могу исключить крейт из компиляции, если функция отключена?

У меня есть проект 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 в рабочей области?

То, что вы говорите, что хотите, чтобы произошло, — то и происходит. Если при построении корневого ящика передается --no-default-features, то x-crate не строится. Что вы видите, что указывает на то, что x-crate компилируется? Возможно, есть другая зависимость, использующая ее или включающая эту функцию?

kmdreko 18.06.2024 00:58

Являются ли эти ящики частью одного и того же рабочего пространства? Если да, то вы создаете рабочее пространство (с cargo build в корне) или конкретный проект?

Cerberus 18.06.2024 04:31

@kmdreko Я пробовал использовать —no-default-features и закомментировать строку, в которой x указано по умолчанию, но безрезультатно.

feds01 18.06.2024 09:21

@Cerberus да, все они являются частью одного рабочего пространства. Представленная мной диаграмма пытается проиллюстрировать дерево зависимостей ящиков, хотя я не уверен, что оно было слишком ясным.

feds01 18.06.2024 09:23

@kmdreko В моем конкретном случае использования я тестирую этот проект на машине, которая не поддерживает x, когда я пытаюсь его скомпилировать, один из сигналов static_assert указывает на то, что эта конфигурация машины не поддерживается. Я думаю, это хороший показатель того, что крейт компилируется.

feds01 18.06.2024 09:46

@feds01 попробуйте для проверки работоспособности удалить все папки с артефактами сборки и перестроить

Alexey S. Larionov 18.06.2024 09:49

@AlexeyS.Larionov Я понял, что он включен, потому что он автоматически указывается в манифесте моей рабочей области независимо от указанного набора функций. Можно ли каким-либо образом указать функции в виртуальном манифесте рабочей области?

feds01 18.06.2024 10:14
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
7
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Крейт компилируется, поскольку в рабочей области Cargo по умолчанию собирает все пакеты.

Вы можете создать только конкретный пакет (и его зависимости) с помощью cargo build --package <package> (cargo build -p <package>) или установить пакет по умолчанию для всех cargo build через workspace.default-members.

Другие вопросы по теме