# Cargo и crates.io

> Cargo — официальная система сборки и менеджер пакетов Rust; crates.io — центральный реестр пакетов (крейтов).

Источник: https://llmdocs.ru/wiki/cargo/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: система сборки и менеджер пакетов
- **Язык**: Rust
- **Файлы проекта**: `Cargo.toml`, `Cargo.lock`
- **Реестр**: crates.io
- **Документация крейтов**: docs.rs
- **Входит в**: стандартную установку Rust (rustup)
- **Лицензия**: MIT / Apache 2.0
- **Сайт**: [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo/)
**Cargo** — официальная система сборки и менеджер пакетов языка [Rust](https://llmdocs.ru/wiki/rust.md), а **crates.io** — центральный публичный реестр пакетов, которые в Rust называют **крейтами** (crates). Cargo скачивает зависимости, компилирует проект, запускает тесты и бенчмарки, генерирует документацию и публикует крейты. Единый стандартный инструмент — одна из причин, почему экосистему Rust часто приводят в пример: любой проект собирается командой `cargo build` без отдельной настройки системы сборки.

## История

Cargo создавался с 2014 года, параллельно с подготовкой Rust 1.0, разработчиками Иегудой Кацем и Карлом Лерке — авторами Bundler для Ruby. Реестр crates.io открылся незадолго до стабильного выпуска языка. Cargo поставляется вместе с компилятором через rustup. Со временем в него встроили команды, которые раньше были сторонними расширениями, — например, `cargo add`. Подробные правила описаны в «Книге Cargo».[1]

## Структура проекта

```bash
cargo new hello        # бинарный проект
cargo new --lib mylib  # библиотека
```

```text
hello/
├── Cargo.toml     # манифест: имя, версия, зависимости
├── Cargo.lock     # точные версии всего дерева зависимостей
└── src/
    └── main.rs    # для библиотеки — lib.rs
```

Манифест:

```toml
[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](https://llmdocs.ru/wiki/clippy-rustfmt.md)) |
| `cargo publish` | опубликовать крейт на crates.io |
| `cargo install ripgrep` | установить утилиту из crates.io |

## Версии и зависимости

Версии крейтов следуют [семантическому версионированию](https://llmdocs.ru/wiki/semver.md). Запись `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](https://llmdocs.ru/wiki/pip-pypi.md) | [npm](https://llmdocs.ru/wiki/npm.md) | [Go-модули](https://llmdocs.ru/wiki/go-modules.md) |
|---|---|---|---|---|
| Сборка | встроена | нет | скрипты | встроена (`go build`) |
| Файл блокировки | `Cargo.lock` | нет | `package-lock.json` | `go.sum` (хеши) |
| Реестр | crates.io | PyPI | npmjs.com | любые Git-репозитории + прокси |
| Тесты и документация | встроены | нет | скрипты | встроены |

## См. также

- [Rust (язык)](https://llmdocs.ru/wiki/rust.md)
- [Семантическое версионирование](https://llmdocs.ru/wiki/semver.md)
- [Clippy и rustfmt](https://llmdocs.ru/wiki/clippy-rustfmt.md)
- [pip и PyPI](https://llmdocs.ru/wiki/pip-pypi.md)

## Источники

1. [The Cargo Book](https://doc.rust-lang.org/cargo/)
2. [The Cargo Book — Specifying Dependencies](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html)
3. [The Cargo Book — Workspaces](https://doc.rust-lang.org/cargo/reference/workspaces.html)
4. [The Cargo Book — Features](https://doc.rust-lang.org/cargo/reference/features.html)
5. [crates.io — Policies](https://crates.io/policies)
6. [RustSec Advisory Database](https://rustsec.org/)
