Как заставить крейт быть доступным только в зависимости от разработки

Я пишу ящик, содержащий несколько макетов реализации моих черт. Эти черты будут использоваться в моих тестах.

Поскольку этот ящик предназначен только для тестирования, я бы хотел включить его только в dev-dependencies файла Cargo.toml.

Как я могу этого добиться?

Я попытался просмотреть файл манифеста: https://doc.rust-lang.org/cargo/reference/manifest.html но не смог найти ни одного параметра, который можно было бы указать в Cargo.toml что эту библиотеку следует импортировать только как зависимость от разработчиков.

Что пойдет не так, если использовать его как обычную зависимость?

Cerberus 16.04.2024 12:00

Вы не можете. И это странное требование. Что, если кто-то захочет использовать ваш крейт в другом, который также предназначен для использования в качестве зависимости для разработчиков? Это было бы невозможно!

Peter Hall 16.04.2024 12:43

@Cerberus Он получит неправильное значение

Lockface77 16.04.2024 13:25
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
3
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Невозможно сделать так, как вы говорите, но вы можете сделать то же самое, немного по-другому. Взгляните на идею Faux о том, как экспортировать тестовые макеты во внешние ящики: https://nrxus.github.io/faux/guide/exporting-mocks.html Я думаю, вы можете сделать то же самое со своими собственными макетами, как хорошо.

По сути, идея заключается в том, чтобы иметь функциональный флаг, который позволяет использовать макеты, созданные вами в вашем ящике. Бывший. функция mocks:

#[cfg(feature = "mocks")]
struct Something { ... }

Определите его в своем ящике Cargo.toml, но не включайте по умолчанию:

[features]
mocks = []
default = []

И используйте свой ящик из другого ящика с макетами, включенными только в разработке:

[dependencies]
my-crate = "1.2.3"

[dev-dependencies]
my-create = { version = "1.2.3", features = "mocks" }

Это не дает желаемого результата, т. е. делает невозможным неправильное включение ящика.

Chayim Friedman 16.04.2024 15:06

ладно, было неясно, следует ли соблюдать это правило. в противном случае предлагаемое решение способно решить проблему с макетами разработчиков.

Igor Artamonov 16.04.2024 15:37

Вы можете использовать cargo tree -e=no-dev -i your_crate. Это напечатает ваш путь зависимости к этому ящику или иначе:

warning: nothing to print.

To find dependencies that require specific target platforms, try to use option `--target all` first, and then narrow your search scope accordingly.

Если этот крейт используется в зависимостях разработки, но не в других местах, или:

error: package ID specification `your_crate` did not match any packages

Если он вообще не используется.

Вы можете создать сценарий, который будет искать warning: nothing to print и error: package ID specification `your_crate` did not match any packages и возвращать ошибку, если ее нет в выходных данных, и запускать его на своем CI или чем-то еще.

Однако обратите внимание, что выходной формат cargo tree никоим образом не гарантирован, поэтому он может сломаться без предупреждения.

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

После еще некоторого тестирования и внедрения я понял, что ящик следует разрешить не только dev-dependencies по следующим причинам:

  • Как отметил @Peter Hall, кто-то может использовать мой ящик в другом ящике, который также является тестовым ящиком. Если бы он был доступен только в dev-dependencies, он не был бы экспортирован.
  • Когда я работаю с рабочими пространствами, я хочу, чтобы мой тестовый крейт находился в зависимостях рабочего пространства (таким образом я могу обновлять его только в одном месте), и мы не можем включать dev-dependency в рабочее пространство.

С учетом вышесказанного, мой первоначальный вопрос заключался в том, чтобы действительно «разрушить все, если не в зависимости от разработки», но даже если бы это было возможно, этого не следует делать по вышеуказанным причинам.

Альтернативно можно использовать обходной путь Хаима Фридмана, чтобы гарантировать, что мы не включим зависимость dev-only по ошибке в реальные зависимости крейта.

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