$ sudo teach IT
Модуль 2 · Cargo.toml

Dev и Build зависимости

Не все зависимости одинаковы. Одни нужны только для тестов, другие — только при сборке. Cargo умеет это разделять.

📖 Теория 🕐 ~15 минут
🧪

[dev-dependencies] — только для тестов

Зависимости в [dev-dependencies] компилируются только когда вы запускаете cargo test, cargo bench или пишете примеры в папке examples/. В финальный бинарник (cargo build --release) они не попадают. Это уменьшает размер и время компиляции продакшен-сборки.

Cargo.toml
[dependencies]
serde = { version = "1", features = ["derive"] }

[dev-dependencies]
pretty_assertions = "1"    # красивый вывод различий в тестах
rstest = "0.18"            # параметризованные тесты
tempfile = "3"             # временные файлы для тестов
tokio = { version = "1", features = ["rt", "macros"] }  # async тесты

Добавить через команду:

Терминал
cargo add --dev pretty_assertions
cargo add --dev rstest

Популярные dev-зависимости:

pretty_assertionsКрасивое сравнение в assert_eq! — показывает diff вместо длинного вывода
rstestПараметризованные тесты — запуск одного теста с разными входными данными
tempfileВременные файлы и директории, автоматически удаляются после теста
mockallМокирование трейтов для изоляции тестов
instaSnapshot-тестирование: сохраняет вывод и сравнивает с эталоном
🔨

[build-dependencies] — только для build.rs

[build-dependencies] — зависимости для специального файла build.rs, который запускается до компиляции основного кода. Используется для: генерации кода, компиляции C-библиотек, встраивания версии Git, генерации Protobuf/gRPC кода.

Cargo.toml
[package]
name = "my_app"
version = "0.1.0"
edition = "2021"
build = "build.rs"         # указываем путь к build script (необязательно, build.rs находится автоматически)

[build-dependencies]
cc = "1"                   # компиляция C/C++ кода
prost-build = "0.12"       # генерация кода из .proto файлов
vergen = "8"               # встраивание git-информации в бинарник
⚠️ Важно: крейты из [build-dependencies] недоступны в обычном коде (src/). И наоборот — обычные зависимости недоступны в build.rs. Это специально: Cargo строго разделяет окружение сборки и окружение выполнения.
📊

Три секции зависимостей — итого

[dependencies]
Основные зависимости. Компилируются всегда. Попадают в финальный бинарник.
[dev-dependencies]
Только для тестов и примеров. В релизный бинарник не попадают.
[build-dependencies]
Только для build.rs. Запускаются до компиляции основного кода.
📌 Что важно запомнить
→ [dev-dependencies] — только для cargo test/bench/examples, не в релиз
→ [build-dependencies] — только для build.rs, недоступны в src/
→ cargo add --dev имя — добавить в dev-dependencies
→ Разделение снижает размер финального бинарника и ускоряет релизную сборку

Тест

1 вопрос