Инструменты и настройка Rust: всё, что нужно
Когда начинаешь знакомство с Rust, на тебя сразу сыплется куча новых названий: rustup, rustc, cargo, clippy, rustfmt, rust-analyzer. Может показаться, что нужно десять инструментов, прежде чем написать хоть одну строку. Хорошая новость: почти все они ставятся одним установщиком, и у каждого одна понятная задача.
Представь кухню. rustup — магазин, который привозит и меняет тебе оборудование. cargo — шеф-повар, который всем заправляет. clippy — доброжелательный наставник, который заглядывает через плечо, а rustfmt поддерживает порядок на столе. На этой странице разберём каждый инструмент, что нужно твоей операционной системе и как разработчик на Rust пользуется всем этим каждый день.
Если ты ещё не установил Rust, пошаговая установка и первый проект описаны в уроке Первые шаги. Основы cargo (cargo new, cargo add, Cargo.toml) — в уроке Cargo и крейты. Эта страница продолжает оба.
Общая картина
Заголовок раздела «Общая картина»Весь набор инструментов в одной таблице:
| Инструмент | Что делает | Ставится вместе с rustup? |
|---|---|---|
rustup |
Устанавливает Rust, обновляет его и переключает версии | Он сам и есть установщик |
rustc |
Компилятор: превращает твои файлы .rs в программу |
Да |
cargo |
Собирает, запускает, тестирует и добавляет крейты. Нужен почти для всего | Да |
rustup doc |
Открывает документацию стандартной библиотеки и книгу Rust в браузере без интернета | Да (профиль default) |
clippy |
Линтер: находит ошибки и подсказывает, как написать код проще | Да (профиль default) |
rustfmt |
Форматировщик: переписывает код в стандартном стиле | Да (профиль default) |
rust-analyzer |
«Мозг редактора»: автодополнение, ошибки прямо в коде, подсказки типов, переход к определению | Не по умолчанию. Расширение для VS Code приносит свою копию |
| Отладчик | Останавливает программу на нужной строке и показывает её переменные | Нет. LLDB или GDB ставятся отдельно (или вместе с расширением редактора) |
Профиль (profile) — это набор компонентов, которые устанавливает rustup. Обычная установка использует профиль default: он добавляет к компилятору и cargo документацию, clippy и rustfmt. Если твой компьютер настраивали с профилем minimal, cargo clippy скажет, что он не установлен. Это исправляется одной командой: rustup component add clippy rustfmt.
Попробуй один раз выполнить rustup doc --std. Команда открывает полную документацию стандартной библиотеки прямо с твоего диска, так что она работает и в самолёте, и при медленном интернете. Документацию твоего собственного проекта и всех крейтов, которые он использует, открывает cargo doc --open (подробнее — в уроке Документация).
Перед установкой: что нужно каждой ОС
Заголовок раздела «Перед установкой: что нужно каждой ОС»Rust компилирует твой код, но в самом конце ему нужен компоновщик (linker) — программа, которая собирает скомпилированные части в один файл, который можно запустить. Rust использует компоновщик из C-инструментов твоей системы. Поэтому для каждой ОС нужен небольшой дополнительный шаг.
| ОС | Что установить | Как |
|---|---|---|
| Windows (рекомендуется) | C++-инструменты Visual Studio: компоновщик MSVC и Windows SDK | Выбери набор Desktop development with C++ (Разработка классических приложений на C++) в установщике Visual Studio |
| Windows (альтернатива) | Тулчейн GNU (MinGW) | rustup toolchain install stable-gnu |
| Windows (ещё вариант) | WSL — настоящий Linux внутри Windows | wsl --install, затем шаги для Linux |
| macOS | Инструменты командной строки Apple (в них есть компилятор C и компоновщик) | xcode-select --install |
| Debian / Ubuntu | Компилятор C и компоновщик | sudo apt install build-essential |
| Fedora | Компилятор C и компоновщик | sudo dnf install gcc |
Несколько честных замечаний:
- Windows и Visual Studio. Искать всё это самому не придётся: если Visual Studio нет,
rustup-init.exeпредложит установить её. Он ставит Visual Studio Community, которая бесплатна для частных лиц, студентов и open source, но не для любой компании. Если ставишь на работе, уточни, какой редакцией пользуется твоя компания. Набора «Desktop development with C++» хватает для всего, что нужно Rust. - Windows и GNU. Тулчейн MSVC стоит по умолчанию и лучше всего дружит с другими программами для Windows. Тулчейну GNU для простых программ Visual Studio не нужна, но многие крейты с кодом на C не соберутся, пока ты не поставишь ещё и MSYS2 с MinGW. Большинству лучше остаться на MSVC.
- WSL — отличный выбор, если тебе нужна среда Linux в Windows (например, потому что твой сервер работает на Linux). Внутри WSL Rust ставится обычной командой для Linux, отдельно от установки в Windows.
- Дополнения для Linux. Некоторые популярные крейты работают с системными библиотеками. Если сборка падает с сообщением про
pkg-configили OpenSSL, в Ubuntu поставь ещёpkg-configиlibssl-dev.
После этого переходи к шагам установки из урока Первые шаги.
rustup на практике
Заголовок раздела «rustup на практике»Когда Rust установлен, rustup — это инструмент, которым ты за ним ухаживаешь. Новая стабильная версия Rust выходит каждые шесть недель, так что обновляться — нормальная привычка:
rustup update # обновить все установленные тулчейны (и сам rustup)rustup show # что установлено и какой тулчейн активен здесьrustup show выводит примерно такое (с сокращениями):
Default host: x86_64-unknown-linux-gnu
installed toolchains--------------------stable-x86_64-unknown-linux-gnu (active, default)
active toolchain----------------name: stable-x86_64-unknown-linux-gnuactive because: it's the default toolchainЗдесь видно платформу по умолчанию, список установленных тулчейнов и какой из них сейчас активен (и почему — потому что он выбран по умолчанию).
Stable, beta и nightly
Заголовок раздела «Stable, beta и nightly»Тулчейн (toolchain) — это один полный комплект из rustc, cargo и их спутников. У Rust три канала выпуска:
| Канал | Что это | Когда использовать |
|---|---|---|
| stable | Официальный выпуск, каждые шесть недель | Почти всегда. Тебе нужен именно он |
| beta | Следующий стабильный выпуск, который сейчас тестируют | Хочешь проверить проект перед следующим выпуском |
| nightly | Собирается каждую ночь, с экспериментальными возможностями | Его требует инструмент или крейт, или хочется попробовать новую возможность |
Можно держать несколько тулчейнов рядом:
rustup toolchain install nightly # поставить nightly рядом со stablecargo +nightly build # использовать nightly для одной командыrustup default stable # выбрать тулчейн, который используется вездеЗакрепляем тулчейн для проекта
Заголовок раздела «Закрепляем тулчейн для проекта»Иногда проекту нужна определённая версия Rust. Положи в папку проекта файл rust-toolchain.toml, и rustup будет автоматически переключаться, когда ты работаешь в этой папке:
[toolchain]channel = "1.97.0"components = ["clippy", "rustfmt"]targets = ["wasm32-unknown-unknown"]Добавь этот файл в git. Тогда вся команда (и твой CI) будут использовать в точности один и тот же компилятор, а rustup сам установит его, если его нет. Большинству небольших проектов этот файл вообще не нужен — они просто используют последнюю stable-версию.
Компоненты и цели
Заголовок раздела «Компоненты и цели»Компоненты (components) — дополнительные части тулчейна. Цели (targets) позволяют компилировать для другого типа машины:
rustup component add clippy rustfmt rust-src # rust-src: исходники std, их использует rust-analyzerrustup component list --installed # посмотреть, что установленоrustup target add wasm32-unknown-unknown # компилировать Rust для браузераЦель wasm32-unknown-unknown нужна для WebAssembly.
Редакторы и IDE
Заголовок раздела «Редакторы и IDE»Писать на Rust можно в любом текстовом редакторе, но редактор с rust-analyzer (или похожим движком) меняет всё. Ты видишь ошибки по мере набора, рядом с переменными появляются их типы, и можно перейти к определению любой функции. Для новичка такая обратная связь — как терпеливый репетитор.
| Редактор | Цена | Поддержка Rust | Кому подойдёт |
|---|---|---|---|
| VS Code + rust-analyzer | Бесплатно | Официальное расширение rust-analyzer | Большинству. Это самый популярный вариант, и большинство руководств рассчитаны на него |
| RustRover (JetBrains) | Бесплатно для некоммерческого использования (учёба, хобби-проекты, неоплачиваемый open source). Для коммерческой работы нужна платная подписка | Встроена: собственный движок Rust от JetBrains и встроенный отладчик | Тем, кто любит полноценную IDE, где всё уже включено |
| Zed | Бесплатно, open source | Встроена (использует rust-analyzer, а для отладки — CodeLLDB) | Очень быстрый современный редактор |
| Neovim / Helix | Бесплатно, open source | Через rust-analyzer. Helix работает почти сразу, Neovim нужно немного настроить | Тем, кто любит работать в терминале |
| Visual Studio | Платные редакции и бесплатная Community | Официальной поддержки Rust нет | Для Rust подходит плохо. Тебе нужны только её C++ Build Tools ради компоновщика |
Условия лицензии RustRover могут меняться, поэтому перед использованием на работе проверь актуальные правила на странице RustRover (на английском).
Для Neovim, Helix и других редакторов саму программу rust-analyzer ставь командой rustup component add rust-analyzer.
Рекомендуемые расширения для VS Code
Заголовок раздела «Рекомендуемые расширения для VS Code»Если ты пользуешься VS Code, эти четыре расширения закрывают почти всё:
- rust-analyzer — самое главное: автодополнение, ошибки, подсказки, рефакторинг.
- CodeLLDB — отладчик для точек останова и пошагового выполнения. Включает собственную копию LLDB.
- Even Better TOML — подсвечивает и проверяет твой
Cargo.toml. - Error Lens (по желанию) — показывает сообщения об ошибках прямо в строке, а не только при наведении. Кто-то его обожает, кому-то он кажется слишком шумным.
Отладка
Заголовок раздела «Отладка»Точки останова с CodeLLDB
Заголовок раздела «Точки останова с CodeLLDB»Когда в VS Code установлены rust-analyzer и CodeLLDB, над fn main и над каждым тестом появляются маленькие ссылки Run | Debug. Щёлкни слева от номера строки, чтобы поставить красную точку останова, затем нажми Debug. Программа остановится на точке останова, и ты сможешь посмотреть все переменные и пройти код строка за строкой.
Если нужна повторно используемая настройка (например, чтобы передавать аргументы командной строки), создай .vscode/launch.json:
{ "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug task_queue", "cargo": { "args": ["build", "--bin=task_queue"] }, "args": [], "cwd": "${workspaceFolder}" } ]}Часть cargo говорит CodeLLDB сначала собрать программу через cargo, а потом запустить её в отладчике. Замени task_queue на название своего пакета, а аргументы программы укажи в "args". Нажми F5, чтобы начать.
Быстрые проверки с dbg!
Заголовок раздела «Быстрые проверки с dbg!»Полноценный отладчик нужен не всегда. Макрос dbg! выводит выражение, его значение, а также файл и строку, где ты его написал. И он возвращает значение обратно, поэтому им можно обернуть почти что угодно, не меняя поведение кода:
fn apply_discount(price: u32, percent: u32) -> u32 { price - price * percent / 100}
fn main() { let prices = [120, 45, 80];
let total: u32 = dbg!(prices.iter().sum()); let final_price = dbg!(apply_discount(total, 10));
println!("Итого со скидкой 10%: {final_price}");}Вывод:
Итого со скидкой 10%: 221Куда делись строки от dbg!? dbg! печатает в stderr (поток ошибок), а не в stdout, как println!. Так отладочные заметки не смешиваются с настоящим выводом программы. В терминале или в разделе «Standard Error» в Playground ты увидишь ещё и это:
[src/main.rs:8:22] prices.iter().sum() = 245[src/main.rs:9:23] apply_discount(total, 10) = 221Когда закончишь, убери вызовы dbg!. Они для тебя, а не для твоих пользователей.
Качество кода каждый день
Заголовок раздела «Качество кода каждый день»Три команды держат код в хорошей форме. Они быстрые, так что запускай их почаще.
cargo check: быстрая обратная связь
Заголовок раздела «cargo check: быстрая обратная связь»cargo check находит ошибки компиляции, не собирая программу для запуска, поэтому он намного быстрее cargo build. Многие разработчики запускают его каждые несколько минут. (rust-analyzer в твоём редакторе делает похожую проверку сам при каждом сохранении.)
cargo fmt: больше никаких споров о стиле
Заголовок раздела «cargo fmt: больше никаких споров о стиле»cargo fmt переписывает каждый файл проекта в стандартном стиле Rust. Никому в команде больше не придётся думать о пробелах и переносах строк. Он превращает это:
struct Player{name:String,score:u32}fn top(players:&[Player])->Option<&Player>{players.iter().max_by_key(|p|p.score)}вот в это:
struct Player { name: String, score: u32,}fn top(players: &[Player]) -> Option<&Player> { players.iter().max_by_key(|p| p.score)}Большинство редакторов умеют запускать его при каждом сохранении. В VS Code включи настройку «Format On Save».
cargo clippy: дружеское ревью кода
Заголовок раздела «cargo clippy: дружеское ревью кода»Clippy знает сотни шаблонов, которые ошибочны, медленны или просто читаются хуже, чем могли бы. Вот небольшая программа, которая отлично работает:
fn main() { let tasks: Vec<&str> = vec!["написать документацию", "исправить баг"];
if tasks.len() == 0 { println!("Делать нечего!"); } else { println!("Задач в очереди: {}", tasks.len()); }}Но у cargo clippy есть предложение:
warning: length comparison to zero --> src/main.rs:4:8 |4 | if tasks.len() == 0 { | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tasks.is_empty()` | = note: `#[warn(clippy::len_zero)]` on by defaultClippy предупреждает о сравнении длины с нулём и советует tasks.is_empty() — так понятнее и нагляднее. У каждого предупреждения есть имя (здесь len_zero), по которому можно найти подробное объяснение в списке линтов Clippy (на английском). Вот исправленная версия:
fn main() { let tasks: Vec<&str> = vec!["написать документацию", "исправить баг"];
if tasks.is_empty() { println!("Делать нечего!"); } else { println!("Задач в очереди: {}", tasks.len()); }}Вывод:
Задач в очереди: 2cargo clippy --fix умеет применять многие предложения за тебя. Clippy не всегда прав именно в твоей ситуации, но прав достаточно часто, чтобы чтение каждого предупреждения было быстрым способом выучить идиоматичный Rust.
Полезные дополнительные инструменты для cargo
Заголовок раздела «Полезные дополнительные инструменты для cargo»Добавить новую подкоманду cargo может кто угодно. Они ставятся через cargo install: эта команда скачивает исходники, компилирует их и кладёт программу в ~/.cargo/bin (в Windows — %USERPROFILE%\.cargo\bin). В первый день ничего из этого не нужно, но знать о них стоит:
| Инструмент | Что делает | Установка | Запуск |
|---|---|---|---|
| bacon | Перезапускает check, clippy или тесты при каждом сохранении, в соседнем терминале | cargo install --locked bacon |
bacon, bacon clippy, bacon test |
| cargo-watch | Запускает любую команду cargo при сохранении. Всё ещё работает, но больше не обновляется; автор советует bacon | cargo install --locked cargo-watch |
cargo watch -x check |
| cargo-nextest | Более быстрый запуск тестов с понятным выводом | cargo install --locked cargo-nextest |
cargo nextest run |
| cargo-audit | Сверяет твой Cargo.lock с известными уязвимостями |
cargo install cargo-audit |
cargo audit |
| cargo-outdated | Показывает зависимости, у которых есть новые версии | cargo install --locked cargo-outdated |
cargo outdated |
| cargo-edit | Добавляет cargo upgrade, который повышает версии в Cargo.toml (cargo add уже встроен) |
cargo install cargo-edit |
cargo upgrade |
| cargo-expand | Показывает код, в который превращаются твои макросы и #[derive] |
cargo install cargo-expand |
cargo expand |
| cargo-binstall | Скачивает готовые бинарники вместо компиляции, так что установка занимает секунды | cargo install cargo-binstall |
cargo binstall bacon |
cargo install компилирует из исходников, поэтому первая установка большого инструмента может занять несколько минут. Это нормально. Чтобы потом обновить инструмент, выполни ту же команду установки ещё раз. Посмотреть, что установлено, можно командой cargo install --list. Инструменты для скорости, вроде профилировщиков и бенчмарков, описаны в уроке Производительность.
Совсем без установки: Rust Playground
Заголовок раздела «Совсем без установки: Rust Playground»Rust Playground запускает Rust прямо в браузере. Его открывает каждая кнопка «Попробуй сам» на этом сайте. Он идеально подходит для быстрых экспериментов, чтобы поделиться кусочком кода, когда просишь помощи, или чтобы учиться на компьютере, где нельзя ничего устанавливать.
Что он умеет:
- Запускать код на stable, beta или nightly, в отладочной или release-сборке.
- Использовать 100 самых скачиваемых крейтов с crates.io (плюс крейты из Rust Cookbook и их зависимости), например
serde,rand,regexиtokio. - Запускать
rustfmtи Clippy из меню Tools. - Делиться кодом по ссылке.
Чего он не умеет:
- Работать больше чем с одним файлом.
Cargo.tomlнет, поэтому выбрать другие крейты или версии нельзя. - Выходить в сеть. Код, который скачивает веб-страницу, не сработает.
- Работать с твоими файлами или выполняться долго. Время и память ограничены.
- Удобно запускать интерактивные программы. Пока программа работает, в маленьком поле можно ввести данные, но для чего-то большего, чем быстрая проверка, это неудобно. Примеры на этом сайте никогда не читают ввод, поэтому запускаются одним щелчком.
Когда Playground станет тесен, до локального проекта через cargo new — всего минута.
Чек-лист для нового компьютера
Заголовок раздела «Чек-лист для нового компьютера»Настраиваешь новый компьютер? Пройди этот список один раз:
- Поставь то, что нужно ОС: C++-инструменты Visual Studio (Windows),
xcode-select --install(macOS) илиbuild-essential/gcc(Linux). - Установи Rust с rustup.rs, затем открой новый терминал.
- Проверь:
rustc --versionиcargo --version. - Убедись, что повседневные инструменты на месте:
rustup component add clippy rustfmt. - Поставь редактор с rust-analyzer. Для VS Code добавь расширения rust-analyzer и CodeLLDB.
- Включи в редакторе форматирование при сохранении.
- Создай тестовый проект командой
cargo new helloи запусти в нёмcargo run,cargo clippyиcargo fmt. - Поставь напоминание выполнять
rustup updateраз в месяц-два. - По желанию:
cargo install --locked baconдля мгновенной обратной связи во время работы.
Практика
Заголовок раздела «Практика»1. Проверь свой набор инструментов
Заголовок раздела «1. Проверь свой набор инструментов»На своём компьютере выполни каждую из этих команд и убедись, что ни одна не говорит «not installed»: rustup show, cargo clippy --version, cargo fmt --version. Затем открой офлайн-документацию стандартной библиотеки и найди страницу Vec. Подсказка: rustup doc принимает тему, например полный путь к типу.
Показать решение
rustup showcargo clippy --versioncargo fmt --versionrustup doc std::vec::VecКаждая команда с --version выводит номер версии. Если какая-то вместо этого выдаёт ошибку, поставь недостающую часть через rustup component add clippy или rustup component add rustfmt. Последняя команда открывает страницу Vec в браузере прямо с твоего диска. Если она говорит, что rust-docs не установлен, сначала выполни rustup component add rust-docs.
2. Пусть Clippy тебя научит
Заголовок раздела «2. Пусть Clippy тебя научит»В новом проекте вставь в src/main.rs первую версию программы с задачами из раздела про Clippy. Запусти cargo clippy, прочитай предупреждение, а потом пусть Clippy сам всё исправит. Подсказка: есть флаг, который применяет предложения автоматически.
Показать решение
cargo new task_queuecd task_queue# вставь программу в src/main.rs, затем:cargo clippycargo clippy --fix --allow-dirtycargo clippyПервый cargo clippy показывает предупреждение len_zero. cargo clippy --fix переписывает tasks.len() == 0 в tasks.is_empty(). Флаг --allow-dirty разрешает менять файлы, которые ты ещё не закоммитил в git. Последний запуск не выводит ни одного предупреждения.
- rustup устанавливает и обновляет Rust и переключает тулчейны; cargo собирает, запускает, тестирует и добавляет крейты; rustc — компилятор, который работает под ними.
- Каждой ОС сначала нужен компоновщик: C++-инструменты Visual Studio в Windows,
xcode-select --installв macOS,build-essentialилиgccв Linux. - Оставайся на stable. Используй
rust-toolchain.toml, только когда проекту нужно закрепить версию, аcargo +nightly— для разовых команд на nightly. - Работай в редакторе с rust-analyzer. Самая распространённая связка — VS Code с rust-analyzer и CodeLLDB.
- Запускай
cargo checkпочаще, аcargo fmtиcargo clippy— перед каждым коммитом.dbg!— для быстрого взгляда, отладчик — для сложных ошибок. - Playground отлично подходит для экспериментов и обмена кодом, но это один файл, без сети и только с самыми популярными крейтами.
Проверь себя
Заголовок раздела «Проверь себя»Проверь себя
1. Каким инструментом установить тулчейн nightly рядом со stable?
2. Сборка в Windows падает, потому что не найден компоновщик. Чего, скорее всего, не хватает?
3. Куда dbg! выводит свои данные?
4. Что из этого Rust Playground НЕ умеет?
Результат: 0 / 4
Что почитать
Заголовок раздела «Что почитать»- Установка Rust — rust-lang.org: официальный установщик для любой платформы, а также заметки про Windows,
PATHи удаление. - The rustup book (на английском): тулчейны, каналы, компоненты, профили,
rust-toolchain.tomlи цели для кросс-компиляции. - The Cargo Book (на английском): всё о cargo, включая
cargo installи параметры каждой команды. - Руководство rust-analyzer (на английском): настройка rust-analyzer в VS Code, Neovim, Helix, Emacs и других редакторах, а также все его параметры.
- Документация Clippy (на английском): как запускать и настраивать Clippy, со ссылкой на полный список линтов и описание каждого.