Модуль 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 вопрос