Cargo - пакетный менеджер для Rust

Cargo - это пакетный менеджер языка Rust. Cargo создает каркас проекта, следит за зависимостями, собирает и компилирует ваш проект. В отличие от многих других языков, в Rust пакетный менеджер разрабатывался вместе с компилятором языка. Поэтому Cargo - это стандарт. Отсутствие зоопарка систем сборки позволяет снизить порог вхождения в чужие проекты за счет одинаковой структуры проектов и единого унифицированного способа сборки зависимостей.

Структура приложения

Для того чтобы создать пустой каркас для нового приложения надо вызвать cargo new PORJECT_NAME. По умолчанию Cargo создает проект подключаемой библиотеки. Для того что бы создать бинарное приложение надо передать ключ --bin. Так же можно указать используемую систему контроля версий (поддерживается git и mercurial) --vcs VCS_NAME. В таком случае cargo инициализирует репозиторий и создаст ignore файл. По умолчанию создается git репозиторий.

$ cargo new PROJECT_NAME # Создаст библиотеку
$ cargo new PROJECT_NAME --bin # Создаст бинарное приложение
$ cargo new --vcs git # Создаст приложение и проинициализирует git репозиторий
$ cargo new --vcs hg # Создаст приложение и проинициализирует mercurial репозиторий

Каркас приложения содержит в себе файл манифеста - Cargo.toml и директорию с исходниками src. При первой сборке проекта будет создан еще один файл - Cargo.lock, содержащий конкретные версии используемых зависимостей. В директории src создается один единственный файл:

  • для библиотеки - это lib.rs, содержащий корневой модуль;
  • для приложения - это main.rs, содержащий точку входа в приложение.

Помимо этого проект может содержать следующие директории с файлами, которы не создаются автоматически:

  • tests - директория с интеграционными тестами;
  • examples - директория с примерами того, как использовать ваш проект;
  • benches - директория с нагрузочными тестами.

Манифест (Cargo.toml и Cargo.lock)

Файл Cargo.toml содержит информацию о вашем приложении и его зависимостях. Имеет следующий вид:

# Информация о проекте
[package]
name = "cargo"
version = "0.8.0"
authors = ["Yehuda Katz <wycats@gmail.com>"]
license = "MIT/Apache-2.0"
homepage = "https://crates.io"
repository = "https://github.com/rust-lang/cargo"
documentation = "http://doc.crates.io"
description = """
Cargo, a package manager for Rust.
"""

# Информация о зависимостях
[dependencies]
advapi32-sys = "0.1"
curl = "0.2"

# Информация о зависимостях для dev-версии
[dev-dependencies]
tempdir = "0.3"
hamcrest = "0.1"

Зависимости указываются в виде название = версия. Указанные библиотеки Cargo будет искать в своем репозитории. Если необходимой нам библиотеки нет в репозитории Cargo, можно указать ссылку на ее VCS репозиторий. Здесь мы явно указываем нужный коммит. Если его не указать, Cargo будет брать последний коммит из master ветки.

[dependencies]
color = { git = "https://github.com/bjz/color-rs.git", rev = "bf739419" }

Так же можно просто указать путь к директории, где лежат исходники нужной библиотеки. Путь указывается относительно файла Cargo.toml.

[dependencies]
outer_lib = { path = "/dir/outer_lib" }

При сборке проекта Cargo загружает все новые зависимости (которые не указаны в Cargo.lock), компилирует их и сохраняет их версию в Cargo.lock. При последующих сборках будут использоваться именно те версии, которые указанны в Cargo.lock.

Для того чтобы обновить все зависимости необходимо запустить cargo update. Чтобы обновить конкретную библиотеку, нужно указать ее, используя ключ --package.

$ cargo update # Обновит все зависимости
$ cargo update -p LIB_NAME # Обновит только библиотеку LIB_NAME

Сборка и запуск проекта

Для сборки проекта необходимо будучи в директории проекта запустить cargo build. При этом Cargo автоматически скачает и скомпилирует все зависимости. По умолчанию собирается dev-версия. Для сборки release-версии надо передать ключ --release. Можно указать количество доступных компилятору потоков, передав ключ --jobs COUNT.

Для запуска проекта нужно запустить cargo run. Для запуска тестов - cargo test. Для запуска нагрузочных тестов - cargo bench

$ cargo build # Собрать проект
$ cargo build --release # Собрать релизную версию
$ cargo build --jobs COUNT # Собрать проект используя COUNT потоков
$ cargo run # Собрать и запустить проект
$ cargo test # Запустить тесты
$ cargo bench # Запустить нагрузочные тесты

Сборка документации

Документация для проекта собирается аналогичным образом - командой cargo doc, которая принмает несколько ключей:

  • --open откроет сгенерированную документацию в браузере;
  • --no-deps сгенерирует документацию только для вашего проекта, без зависимостей. По умолчанию генерация запускается идля всех зависимостей.

Сгенерированная документация будет находится в директории target/docs.

Ключевые слова: Rust

Коментарии

Используйте Markdown

Thank you for comment!
Ваше сообщение будет доступно после проверки.

#0 Евгений

Статья помогла, спасибо.