Как использовать локальный неопубликованный крейт в Rust?
Решение: используйте атрибут path в Cargo.toml
Вы почти всё сделали правильно. Ошибка возникает из-за того, что Cargo ожидает, что локальный крейт имеет указанную версию в своём Cargo.toml, но при использовании path версия не обязательна для совпадения. Проблема в том, что Cargo пытается разрешить версию, а у локального крейта может быть несовместимая версия или она не указана. Давайте исправим это.
Пошаговая инструкция
- Убедитесь, что в
my_lib/Cargo.tomlесть полеversion
Откройтеmy_lib/Cargo.tomlи добавьте версию, например:
[package]
name = "my_lib"
version = "0.1.0"
edition = "2021"
- Укажите зависимость в основном проекте с помощью
path
Вmain_project/Cargo.tomlнапишите:
[dependencies]
my_lib = { path = "../my_lib" }
Обратите внимание: путь указывается относительно файла Cargo.toml основного проекта. Если ваш проект находится в /workspace/main_project, а крейт — в /workspace/my_lib, то путь ../my_lib корректен.
- Соберите проект
Выполнитеcargo buildв папкеmain_project. Cargo автоматически найдёт локальный крейт и соберёт его как часть зависимостей.
Проверка работоспособности
В my_lib/src/lib.rs определите простую функцию:
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
В main_project/src/main.rs используйте её:
use my_lib::greet;
fn main() {
println!("{}", greet("Rust developer"));
}
После cargo run вы увидите Hello, Rust developer!.
Важные замечания
- Версия не обязана совпадать — при использовании
pathCargo игнорирует версию в секции[dependencies]. Убедитесь только, что версия указана в самом крейте. - Обновление кода крейта — если вы измените код в
my_lib, просто пересоберите основной проект командойcargo build. Cargo сам перекомпилирует зависимость. Никаких дополнительных действий не требуется. - Рабочее пространство (workspace) — если вы планируете разрабатывать несколько крейтов вместе, рассмотрите использование Cargo Workspaces. Это упростит управление зависимостями и сборкой.
- Отладка ошибок — если Cargo всё равно ругается, проверьте:
- Правильность пути (используйте абсолютные пути для теста:
path = "/home/user/workspace/my_lib"). - Наличие
Cargo.tomlв папке крейта. - Отсутствие циклических зависимостей.
- Правильность пути (используйте абсолютные пути для теста:
Таким образом, локальный неопубликованный крейт подключается просто и гибко. Вы можете свободно редактировать его код и сразу видеть изменения в основном проекте. Это идеально для разработки внутренних библиотек до их публикации.
<<Альтернативный подход: использование Cargo Workspaces
Если вы планируете активно разрабатывать оба крейта (основной проект и библиотеку) одновременно, лучше организовать их как единое рабочее пространство (workspace). Это избавит от проблем с относительными путями и упростит сборку.
Как настроить workspace
Создайте в корневой папке workspace файл Cargo.toml (или используйте существующий) со следующим содержимым:
[workspace]
members = [
"main_project",
"my_lib",
]
Затем в main_project/Cargo.toml укажите зависимость так же, как и раньше:
[dependencies]
my_lib = { path = "../my_lib" }
Но теперь Cargo будет управлять всеми крейтами как единым целым. Выполняйте cargo build из корневой папки workspace, и Cargo соберёт все члены workspace.
Преимущества workspace
- Единая команда сборки —
cargo buildиз корня собирает всё сразу. - Общие зависимости — Cargo оптимизирует версии крейтов, чтобы избежать дублирования.
- Удобство разработки — изменения в
my_libавтоматически учитываются при сборкеmain_project. - Тестирование — можно запускать тесты для всех крейтов одной командой
cargo test.
Этот подход особенно полезен для больших проектов, где несколько крейтов зависят друг от друга. Для простого случая с одним крейтом достаточно первого ответа, но workspace даёт больше гибкости в будущем.
Ответов пока нет.
Войдите чтобы оставить ответ