Я пишу ящик, содержащий несколько макетов реализации моих черт. Эти черты будут использоваться в моих тестах.
Поскольку этот ящик предназначен только для тестирования, я бы хотел включить его только в dev-dependencies файла Cargo.toml.
Как я могу этого добиться?
Я попытался просмотреть файл манифеста: https://doc.rust-lang.org/cargo/reference/manifest.html но не смог найти ни одного параметра, который можно было бы указать в Cargo.toml что эту библиотеку следует импортировать только как зависимость от разработчиков.
Вы не можете. И это странное требование. Что, если кто-то захочет использовать ваш крейт в другом, который также предназначен для использования в качестве зависимости для разработчиков? Это было бы невозможно!
@Cerberus Он получит неправильное значение

Невозможно сделать так, как вы говорите, но вы можете сделать то же самое, немного по-другому. Взгляните на идею 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" }
Это не дает желаемого результата, т. е. делает невозможным неправильное включение ящика.
ладно, было неясно, следует ли соблюдать это правило. в противном случае предлагаемое решение способно решить проблему с макетами разработчиков.
Вы можете использовать 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 по следующим причинам:
dev-dependencies, он не был бы экспортирован.dev-dependency в рабочее пространство.С учетом вышесказанного, мой первоначальный вопрос заключался в том, чтобы действительно «разрушить все, если не в зависимости от разработки», но даже если бы это было возможно, этого не следует делать по вышеуказанным причинам.
Альтернативно можно использовать обходной путь Хаима Фридмана, чтобы гарантировать, что мы не включим зависимость dev-only по ошибке в реальные зависимости крейта.
Что пойдет не так, если использовать его как обычную зависимость?