Cargo и crates.io
| Тип | система сборки и менеджер пакетов |
|---|---|
| Язык | Rust |
| Файлы проекта | Cargo.toml, Cargo.lock |
| Реестр | crates.io |
| Документация крейтов | docs.rs |
| Входит в | стандартную установку Rust (rustup) |
| Лицензия | MIT / Apache 2.0 |
| Сайт | doc.rust-lang.org/cargo |
Cargo — официальная система сборки и менеджер пакетов языка Rust, а crates.io — центральный публичный реестр пакетов, которые в Rust называют крейтами (crates). Cargo скачивает зависимости, компилирует проект, запускает тесты и бенчмарки, генерирует документацию и публикует крейты. Единый стандартный инструмент — одна из причин, почему экосистему Rust часто приводят в пример: любой проект собирается командой cargo build без отдельной настройки системы сборки.
История
Cargo создавался с 2014 года, параллельно с подготовкой Rust 1.0, разработчиками Иегудой Кацем и Карлом Лерке — авторами Bundler для Ruby. Реестр crates.io открылся незадолго до стабильного выпуска языка. Cargo поставляется вместе с компилятором через rustup. Со временем в него встроили команды, которые раньше были сторонними расширениями, — например, cargo add. Подробные правила описаны в «Книге Cargo».[1]
Структура проекта
cargo new hello # бинарный проект
cargo new --lib mylib # библиотека
hello/
├── Cargo.toml # манифест: имя, версия, зависимости
├── Cargo.lock # точные версии всего дерева зависимостей
└── src/
└── main.rs # для библиотеки — lib.rs
Манифест:
[package]
name = "hello"
version = "0.1.0"
edition = "2024"
[dependencies]
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
[dev-dependencies]
criterion = "0.5"
[profile.release]
lto = true
Основные команды
| Команда | Действие |
|---|---|
cargo build / cargo build --release |
сборка в режиме отладки / с оптимизациями |
cargo run |
собрать и запустить |
cargo check |
быстрая проверка без генерации кода |
cargo test |
модульные, интеграционные тесты и примеры из документации |
cargo add serde |
добавить зависимость в Cargo.toml |
cargo update |
обновить версии в Cargo.lock в рамках ограничений |
cargo doc --open |
сгенерировать и открыть документацию |
cargo clippy, cargo fmt |
линтер и форматирование (см. Clippy и rustfmt) |
cargo publish |
опубликовать крейт на crates.io |
cargo install ripgrep |
установить утилиту из crates.io |
Версии и зависимости
Версии крейтов следуют семантическому версионированию. Запись serde = "1.0" по умолчанию означает ^1.0: подходит любая совместимая версия от 1.0.0 до 2.0.0.[2] Точные выбранные версии фиксируются в Cargo.lock; для приложений его коммитят в репозиторий, чтобы сборки были воспроизводимыми.
Зависимости можно брать не только из crates.io, но и из Git-репозитория или локальной папки. Cargo допускает в одном дереве несколько несовместимых версий одного крейта (например, 1.x и 2.x), чем отличается от многих менеджеров пакетов.
Возможности
- Фичи (features) — условная компиляция частей крейта; пользователь включает только то, что нужно, уменьшая время сборки и размер программы.[4]
- Рабочие пространства (workspaces) — несколько крейтов в одном репозитории с общим
Cargo.lockи каталогом сборки.[3] - Профили — настройки оптимизации для
dev,releaseи собственных профилей. - Сценарий сборки
build.rs— код, выполняемый перед компиляцией: генерация кода, сборка C-библиотек. - Расширения — любая программа
cargo-xxxвPATHстановится подкомандойcargo xxx(например,cargo-audit,cargo-watch).
crates.io и docs.rs
На crates.io публикуются открытые крейты. Опубликованную версию нельзя удалить или заменить — только «отозвать» (yank), чтобы новые проекты её не выбирали, но существующие продолжали собираться. Это гарантирует, что однажды собранный проект соберётся снова.[5] Для каждого опубликованного крейта сервис docs.rs автоматически собирает и размещает документацию.
Безопасность
Как и другие публичные реестры, crates.io подвержен рискам цепочки поставок: тайпсквоттингу и вредоносным сценариям build.rs и процедурным макросам, которые выполняются при сборке. Базу известных уязвимостей ведёт проект RustSec, а утилита cargo audit проверяет Cargo.lock по этой базе.[6]
Сравнение
| Cargo | pip | npm | Go-модули | |
|---|---|---|---|---|
| Сборка | встроена | нет | скрипты | встроена (go build) |
| Файл блокировки | Cargo.lock |
нет | package-lock.json |
go.sum (хеши) |
| Реестр | crates.io | PyPI | npmjs.com | любые Git-репозитории + прокси |
| Тесты и документация | встроены | нет | скрипты | встроены |