Модуль 4 · Зависимости и crates.io
Локальные и git-зависимости
Не всегда зависимости берутся из crates.io — можно указать локальный путь или git-репозиторий напрямую.
📖 Теория 🕐 ~20 минут
📁
path — локальная зависимость
Если библиотека находится на вашем компьютере (ещё не опубликована или это внутренний крейт), используйте path:
Cargo.toml
[dependencies]
# Относительный путь от Cargo.toml вашего проекта
my_utils = { path = "../my_utils" }
# Абсолютный путь тоже работает (но непереносимо)
my_utils = { path = "/home/user/projects/my_utils" }
💡 Path-зависимости идеальны при разработке: вы меняете код библиотеки и сразу видите эффект в основном проекте без публикации на crates.io.
Структура файлов при path-зависимости:
projects/
├── my_app/
│ ├── Cargo.toml ← здесь path = "../my_utils"
│ └── src/
└── my_utils/
├── Cargo.toml
└── src/
🔗
git — зависимость из репозитория
Можно использовать крейт прямо из git-репозитория — например, если нужна версия с исправлением бага, которое ещё не вышло на crates.io:
Cargo.toml
[dependencies]
# Последний коммит из ветки main
some_crate = { git = "https://github.com/user/some_crate" }
# Конкретная ветка
some_crate = { git = "https://github.com/user/some_crate", branch = "fix/my-bug" }
# Конкретный тег
some_crate = { git = "https://github.com/user/some_crate", tag = "v1.2.3" }
# Конкретный коммит (самый воспроизводимый)
some_crate = { git = "https://github.com/user/some_crate", rev = "a5da432" }
⚠️ Нельзя опубликовать крейт на crates.io если у него git-зависимости — только path и версии из crates.io. Для публикации нужно дождаться публикации зависимости.
🩹
[patch] — переопределить зависимость
Секция [patch] позволяет заменить зависимость локальной версией или форком — даже транзитивные зависимости. Удобно для тестирования патчей:
Cargo.toml
[dependencies]
serde = "1.0"
# Заменить serde из crates.io на локальную версию (временно):
[patch.crates-io]
serde = { path = "../patched-serde" }
# Или на конкретный коммит из форка:
[patch.crates-io]
serde = { git = "https://github.com/me/serde", branch = "my-fix" }
Это влияет на весь граф зависимостей — даже крейты которые зависят от serde получат пропатченную версию.
📌 Что важно запомнить
→ path = "../lib" — зависимость из локальной папки
→ git = "url" — зависимость прямо из репозитория (+ branch/tag/rev)
→ [patch.crates-io] — переопределить зависимость для всего графа
→ git-зависимости нельзя публиковать на crates.io
Тест
3 вопроса