Cargo: Система сборки и менеджер пакетов Rust

Intermediate

This tutorial is from open-source community. Access the source code

Введение

Добро пожаловать в Hello, Cargo. Этот лаба является частью Rust Book. Вы можете практиковать свои навыки Rust в LabEx.

В этом лабе мы узнаем о Cargo, системе сборки и менеджере пакетов Rust, который упрощает задачи, такие как сборка кода, управление зависимостями и загрузка библиотек для проектов Rust.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 80%. Он получил 100% положительных отзывов от учащихся.

Hello, Cargo

Cargo - это система сборки и менеджер пакетов Rust. Большинство разработчиков Rust используют эту工具 для управления своими проектами Rust, потому что Cargo выполняет много задач за вас, такие как сборка вашего кода, загрузка библиотек, на которые ваше приложение зависит, и сборка этих библиотек. (Мы называем библиотеки, которые ваш код требует, зависимостями.)

Самые простые программы на Rust, такие как те, которые мы писали до сих пор, не имеют зависимостей. Если бы мы построили проект "Hello, world!" с использованием Cargo, то он бы использовал только ту часть Cargo, которая занимается сборкой вашего кода. По мере того, как вы пишете более сложные программы на Rust, вы будете добавлять зависимости, и если вы начнете проект с использованием Cargo, то добавление зависимостей будет намного проще.

Поскольку подавляющее большинство проектов на Rust используют Cargo, в остальной части этой книги предполагается, что вы также используете его. Если вы использовали официальные установщики, описанные в разделе "Установка", то Cargo устанавливается вместе с Rust. Если вы установили Rust каким-то другим способом, проверьте, установлен ли Cargo, введя в терминале следующую команду:

cargo --version

Если вы увидите номер версии, то все в порядке! Если вы увидите ошибку, например, command not found, обратитесь к документации по вашему методу установки, чтобы определить, как отдельно установить Cargo.

Создание проекта с использованием Cargo

Создадим новый проект с использованием Cargo и посмотрим, как он отличается от нашего исходного проекта "Hello, world!". Перейдите обратно в вашу директорию project (или ту, где вы решили хранить свой код). Затем, на любой операционной системе, выполните следующие команды:

cd ~/project
cargo new hello_cargo
cd hello_cargo

Первая команда создает новую директорию и проект под названием hello_cargo. Мы назвали наш проект hello_cargo, и Cargo создает его файлы в директории с таким же именем.

Перейдите в директорию hello_cargo и выведите список файлов. Вы увидите, что Cargo сгенерировал для нас два файла и одну директорию: файл Cargo.toml и директорию src с файлом main.rs внутри.

Cargo также инициализировал новый репозиторий Git вместе с файлом .gitignore. Файлы Git не будут сгенерированы, если вы выполните cargo new внутри существующего репозитория Git; вы можете переопределить это поведение, используя cargo new --vcs=git.

Примечание: Git - это распространенная система контроля версий. Вы можете изменить cargo new, чтобы использовать другую систему контроля версий или не использовать никакую систему контроля версий, используя флаг --vcs. Выполните cargo new --help, чтобы увидеть доступные параметры.

Откройте Cargo.toml в вашем любимом текстовом редакторе. Он должен выглядеть похожим на код из Listing 1-2.

Имя файла: Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

[dependencies]

Listing 1-2: Содержимое Cargo.toml, сгенерированное cargo new

Этот файл имеет формат TOML (Tom's Obvious, Minimal Language), который является форматом конфигурации Cargo.

Первая строка, [package], - это заголовок раздела, который показывает, что следующие声明 конфигурируют пакет. По мере добавления более подробной информации в этот файл мы будем добавлять и другие разделы.

Следующие три строки задают информацию о конфигурации, которую Cargo 需要 для компиляции вашей программы: имя, версию и версию Rust для использования. Мы поговорим о ключе edition в Приложении E.

Последняя строка, [dependencies], - начало раздела, в котором вы можете перечислить любые зависимости вашего проекта. В Rust пакеты кода называются крейтами. Для этого проекта мы не будем нуждааться в других крейтах, но мы будем это делать в первом проекте из главы 2, поэтому мы будем использовать этот раздел зависимостей тогда.

Теперь откройте src/main.rs и посмотрите:

Имя файла: src/main.rs

fn main() {
    println!("Hello, world!");
}

Cargo сгенерировал для вас программу "Hello, world!", точно такую же, какую мы писали в Listing 1-1! До сих пор различия между нашим проектом и проектом, сгенерированным Cargo, заключаются в том, что Cargo поместил код в директорию src, а у нас есть файл конфигурации Cargo.toml в верхней директории.

Cargo ожидает, чтобы ваши исходные файлы располагались внутри директории src. Верхняя директория проекта предназначена только для файлов README, информации о лицензии, файлов конфигурации и всего остального, не связанного с вашим кодом. Использование Cargo помогает вам организовать свои проекты. Там есть место для всего, и все находится на своем месте.

Если вы начали проект, который не использует Cargo, как мы это сделали с проектом "Hello, world!", вы можете преобразовать его в проект, который использует Cargo. Переместите код проекта в директорию src и создайте соответствующий файл Cargo.toml.

Сборка и запуск проекта с использованием Cargo

Теперь посмотрим, что отличается, когда мы собираем и запускаем программу "Hello, world!" с использованием Cargo! В директории hello_cargo введите следующую команду, чтобы собрать ваш проект:

$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

Эта команда создает исполняемый файл в target/debug/hello_cargo, а не в текущей директории. Поскольку по умолчанию сборка - это отладочная сборка, Cargo помещает бинарник в директорию с именем debug. Вы можете запустить исполняемый файл с помощью этой команды:

$./target/debug/hello_cargo
Hello, world!

Если все прошло успешно, Hello, world! должно быть выведено в терминал. Первый запуск cargo build также заставляет Cargo создать новый файл в верхнем уровне: Cargo.lock. Этот файл отслеживает точные версии зависимостей в вашем проекте. В этом проекте нет зависимостей, поэтому файл выглядит довольно пустым. Вы никогда не будете нужно вручную изменять этот файл; Cargo управляет его содержимым для вас.

Мы только что собрали проект с помощью cargo build и запустили его с помощью ./target/debug/hello_cargo, но мы также можем использовать cargo run, чтобы скомпилировать код и затем запустить получившийся исполняемый файл в одной команде:

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/hello_cargo`
Hello, world!

Использование cargo run более удобно, чем запоминать, что нужно сначала запустить cargo build, а затем использовать полный путь к бинарнику, поэтому большинство разработчиков используют cargo run.

Заметьте, что на этот раз мы не увидели вывод, указывающий на то, что Cargo компилирует hello_cargo. Cargo понял, что файлы не изменились, поэтому он не произвел повторной сборки, а просто запустил бинарник. Если бы вы изменили исходный код, Cargo бы пересобрали проект перед запуском, и вы бы увидели этот вывод:

$ cargo run
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
     Running `target/debug/hello_cargo`
Hello, world!

Cargo также предоставляет команду cargo check. Эта команда быстро проверяет ваш код, чтобы убедиться, что он компилируется, но не создает исполняемый файл:

$ cargo check
   Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

Почему бы вам не понадобился исполняемый файл? Чаще всего cargo check работает намного быстрее, чем cargo build, потому что она пропускает этап создания исполняемого файла. Если вы постоянно проверяете свою работу при написании кода, использование cargo check ускорит процесс, позволяя вам узнать, компилируется ли ваш проект! Именно поэтому многие разработчики Rust периодически запускают cargo check при написании программы, чтобы убедиться, что она компилируется. Затем они запускают cargo build, когда готовы использовать исполняемый файл.

Подведем итог того, что мы узнали о Cargo до сих пор:

  • Мы можем создать проект с помощью cargo new.
  • Мы можем собрать проект с помощью cargo build.
  • Мы можем собрать и запустить проект за один шаг с помощью cargo run.
  • Мы можем собрать проект без создания бинарника для проверки ошибок с помощью cargo check.
  • Вместо сохранения результата сборки в той же директории, что и наш код, Cargo хранит его в директории target/debug.

Дополнительным преимуществом использования Cargo является то, что команды одинаковые независимо от операционной системы, на которой вы работаете. Поэтому на этом этапе мы больше не будем предоставлять конкретные инструкции для Linux и macOS по сравнению с Windows.

Сборка для выпуска

Когда ваш проект наконец-то готов к выпуску, вы можете использовать cargo build --release, чтобы скомпилировать его с оптимизациями.

cargo build --release

Эта команда создаст исполняемый файл в target/release вместо target/debug. Оптимизации делают ваш код на Rust работать быстрее, но включение их увеличивает время компиляции вашей программы. Именно поэтому существуют два разных профиля: один для разработки, когда вы хотите быстро и часто пересобирать проект, и другой для сборки финальной программы, которую вы дадите пользователю, которая не будет пересобираться многократно и будет работать как можно быстрее. Если вы проводите бенчмаркирование времени выполнения вашего кода, обязательно запустите cargo build --release и проведите бенчмарк с исполняемым файлом в target/release.

Cargo как договоренность

В простых проектах Cargo не представляет особой ценности по сравнению с использованием только rustc, но его ценность станет очевидной, когда ваши программы станут более сложными. Как только программы вырастают до нескольких файлов или нуждаются в зависимости, гораздо проще поручить сборку Cargo.

Даже несмотря на то, что проект hello_cargo простой, он уже использует много реальных инструментов, которые вы будете использовать в течение всей вашей карьеры Rust. Фактически, чтобы работать над любыми существующими проектами, вы можете использовать следующие команды для извлечения кода с использованием Git, перехода в директорию этого проекта и сборки:

git clone example.org/someproject
cd someproject
cargo build

Для получения дополнительной информации о Cargo ознакомьтесь с его документацией по адресу https://doc.rust-lang.org/cargo.

Резюме

Поздравляем! Вы завершили лабораторную работу Hello, Cargo. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.