Rust: с нуля до своего органайзера Урок 48 из 55
Внешние библиотеки и зависимости
Урок 48. Подключить обоснованную библиотеку и проверить, что именно добавлено.
Текст переведён с помощью ИИ.
Предварительно: Cargo и модули. Сохраните проект органайзера отдельно: ниже маленькая учебная копия. Для первого запуска сеть не нужна.
Образ и опорная карта
Готовая деталь для велосипеда экономит работу, но у неё нужно проверить размер, изготовителя и способ установки. Зависимость — библиотека, которую наш проект подключает вместо написания её кода внутри программы. Крейт (crate) — единица кода и сборки Rust; crates.io — публичный каталог таких библиотек. Предел образа: библиотечный код выполняется с возможностями нашей программы, а каталог и номер версии сами по себе не подтверждают качество и безопасность.
потребность → выбор библиотеки и лицензии → запись в Cargo.toml → точный выбор Cargo.lock → сборка и проверка. Cargo.toml говорит, какие зависимости разрешены проекту. Cargo.lock фиксирует выбранные точные версии для воспроизводимой сборки приложения. В записи version = "1.2" строка — условие выбора совместимой версии, а не обязательно точная загруженная версия; правила совместимости Cargo надо читать отдельно. Поле license на странице крейта и в его источнике описывает условия использования: перед включением в распространяемую программу их нужно прочитать. cargo add добавляет запись, cargo tree показывает дерево подключений. Сеть понадобится при первом получении библиотеки с crates.io. Начнём с собственной крошечной библиотеки по пути: она даст настоящий опыт зависимости без чужого кода и сети.
Сначала проверьте функцию внутри одного файла
fn label(title: &str) -> String {
format!("[{title}]")
}
fn main() {
println!("{}", label("Встреча"));
}
[Встреча]
Этот первый пример работает без зависимости: label добавляет скобки к названию. В следующем шаге мы вынесем ровно эту функцию в отдельный крейт. В Cargo-проекте src/main.rs станет потребителем, а соседняя библиотека — зависимостью. path в Cargo.toml означает путь к локальному крейту; это не публикация на crates.io.
Вопросы для воспроизведения
- Чем условие версии в
Cargo.tomlотличается от выбранной версии вCargo.lock? - Зачем проверить лицензию и документацию перед подключением чужого кода?
- Почему зависимость по
pathработает без сети?
Задание
Обязательное. Сначала добавьте второй вызов label("План") в этот пример. Затем создайте учебную библиотеку organizer_label рядом с каталогом приложения: cargo new --lib organizer_label --vcs none создаёт библиотечный Cargo-проект без отдельного Git-репозитория. Перенесите label в organizer_label/src/lib.rs, добавьте pub перед fn для доступа извне. В Cargo.toml приложения укажите organizer_label = { path = "../organizer_label" } в [dependencies], а в main.rs вызывайте organizer_label::label. Запустите cargo run --offline; проверьте две строки. Команду cargo new выполняйте из родительской папки двух проектов; cargo run --offline — из папки приложения.
Ответы
Показать ответы
Если cargo new сообщает, что каталог уже существует, выберите другое имя для учебной библиотеки. В lib.rs нет main; функция должна быть pub fn label(title: &str) -> String. В основном файле вызов начинается с имени зависимости.
fn label(title: &str) -> String {
format!("[{title}]")
}
fn main() {
println!("{}", label("Встреча"));
println!("{}", label("План"));
}
[Встреча]
[План]
Полный результат переноса в библиотеку
Папки organizer и organizer_label лежат рядом. Файл organizer_label/Cargo.toml уже создан командой cargo new --lib; его имя пакета должно быть organizer_label. В organizer_label/src/lib.rs:
pub fn label(title: &str) -> String {
format!("[{title}]")
}
В organizer/Cargo.toml оставьте существующие поля [package] и добавьте в раздел [dependencies] эту строку:
organizer_label = { path = "../organizer_label" }
organizer/src/main.rs:
fn main() {
println!("{}", organizer_label::label("Встреча"));
println!("{}", organizer_label::label("План"));
}
[Встреча]
[План]
После проверки
После опыта с местным крейтом найдите подходящий крейт на crates.io: откройте документацию, версию, лицензию, дату обновления и список дополнительных зависимостей. При реальной необходимости команда cargo add ИМЯ запишет выбор в манифест и обновит lock-файл; cargo tree покажет цепочку. Не добавляйте библиотеку лишь ради этого упражнения. Для приложения сохраняйте Cargo.lock в Git. Официальное руководство Cargo по зависимостям.
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.