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

Секция [dependencies]

Как добавлять библиотеки, как указывать версии и что такое Cargo.lock.

📖 Теория 🕐 ~25 минут
➕

cargo add — самый простой способ

Самый быстрый способ добавить зависимость — команда cargo add. Она сама найдёт последнюю версию на crates.io и добавит в Cargo.toml:

Терминал
cargo add serde                    # добавить последнюю версию serde
cargo add serde --features derive  # добавить с фичей derive
cargo add tokio --features full    # tokio со всеми фичами
cargo add --dev pretty_assertions  # добавить как dev-зависимость
cargo add rand@0.8                 # добавить конкретную версию

После cargo add serde Cargo добавит строку в Cargo.toml:

Cargo.toml · После cargo add serde
[dependencies]
serde = "1.0"
💡 Почему "1.0", а не точная версия типа "1.0.197"? Это версионное требование — "1.0" означает «любая версия ≥1.0 и <2.0». Точные правила — ниже в этом уроке.
✏️

Ручное редактирование Cargo.toml

Можно добавить зависимость прямо в файл. Форматы записи:

Cargo.toml · Форматы записи зависимостей
[dependencies]
# Краткий формат: имя = "версионное требование"
rand = "0.8"
serde = "1"

# Расширенный формат (таблица): нужен для фич, опций и т.д.
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

# Опциональная зависимость (подробнее в уроке про фичи)
rayon = { version = "1.8", optional = true }
💡 После ручного редактирования Cargo.toml не нужно запускать никакую команду — Cargo подхватит изменения при следующем cargo build или cargo run.
🎯

Версионные требования

В Cargo.toml вы не пишете точную версию — вы пишете требование: какой диапазон версий приемлем. Cargo найдёт подходящую автоматически.

"1.2.3"
Caret (^) — по умолчанию. Эквивалентно "^1.2.3". Означает: ≥1.2.3 и <2.0.0. Разрешает обновление MINOR и PATCH, но не MAJOR. Самый распространённый вариант.
"^1.2.3"
Явный caret. ≥1.2.3 и <2.0.0. Примеры: ^0.2.3 = ≥0.2.3 и <0.3.0 (для нестабильного API — более строго). ^0.0.3 = только 0.0.3.
"~1.2.3"
Tilde — только патчи. ≥1.2.3 и <1.3.0. Обновляет только PATCH. Используйте когда хотите минимальные обновления.
"=1.2.3"
Точная версия. Только версия 1.2.3, ничего больше. Используйте редко — блокирует любые обновления включая патчи с исправлениями безопасности.
">=1.2, <2"
Диапазон. Любая версия от 1.2 (включительно) до 2.0 (не включая). Можно комбинировать несколько условий через запятую.
"*"
Wildcard — любая версия. Не рекомендуется: может скачать несовместимую версию. Используйте только в личных экспериментах.
Шпаргалка по версионным требованиям
Требование    Минимум    Максимум (не включая)
"1"           1.0.0      2.0.0
"1.2"         1.2.0      2.0.0
"1.2.3"       1.2.3      2.0.0
"^1.2.3"      1.2.3      2.0.0
"~1.2.3"      1.2.3      1.3.0
"=1.2.3"      1.2.3      1.2.3 (только эта версия)
"0.2"         0.2.0      0.3.0  ← нестабильный API строже
"*"           0.0.0      ∞
🔒

Cargo.lock — зачем он нужен

Cargo.toml содержит требования к версиям. Cargo.lock содержит точные версии всего, что Cargo выбрал. Разница важна:

Cargo.toml

Пишете вы вручную. Содержит диапазоны: serde = "1". Читаемый, лаконичный.

Cargo.lock

Генерирует Cargo автоматически. Содержит точные версии: serde 1.0.197, все транзитивные зависимости, хэши. Не редактировать вручную.

Правило для git:

✅
Приложение (бинарник): коммитьте Cargo.lock. Это гарантирует, что у всех в команде и на CI одинаковые версии зависимостей.
❌
Библиотека (lib): добавьте Cargo.lock в .gitignore. Пользователи библиотеки должны сами разрешать версии, чтобы избежать конфликтов.
📌 Что важно запомнить
→ cargo add имя — добавляет последнюю версию автоматически
→ "1.2" = caret по умолчанию = ≥1.2.0 и <2.0.0
→ ~ — только патчи, = — точная версия, * — любая (не рекомендуется)
→ Cargo.lock: коммитить для приложений, игнорировать для библиотек
→ Фичи добавляются через features = [...] в расширенном формате

Тест

3 вопроса