Cargo и crates.io

Материал из llmdocs — справочник разработчика
Портал: Go и Rust
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-репозитории + прокси
Тесты и документация встроены нет скрипты встроены

См. также

Источники

  1. The Cargo Book
  2. The Cargo Book — Specifying Dependencies
  3. The Cargo Book — Workspaces
  4. The Cargo Book — Features
  5. crates.io — Policies
  6. RustSec Advisory Database