← Оглавление

0.3 Фамильяр

У каждого мага есть фамильяр, и у каждого ученика уходят недели на то, чтобы понять, что фамильяр умеет делать помимо очевидного. Cargo уже ответил один раз - и этого хватило, чтобы что-то появилось. Но у него есть команды, о которых ещё не спрашивали. Молчание не означает, что их нет.

Что нужно

cargo run запустил tq - этого достаточно, чтобы начать. Но в работе над любым реальным проектом одной команды мало. Код нужно проверять без запуска. Форматировать, не думая о пробелах. Просить об анализе, который выходит за пределы синтаксиса.

У Cargo есть команды для каждого из этих шагов. Стоит знать их все.

Что же он умеет?

cargo check

Проверяет код без компиляции. Cargo разбирает исходник, применяет правила компилятора и сообщает об ошибках - но не создаёт исполняемый файл. Это быстрее, чем cargo build: полезно, когда хочется убедиться, что код корректен, не ожидая полной сборки.

cargo check
    Checking tq v0.1.0 (.../tq)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s

cargo build

Компилирует проект и создаёт исполняемый файл. Результат появляется в target/debug/tq. В отличие от cargo run, файл не запускается - только собирается.

cargo build
   Compiling tq v0.1.0 (.../tq)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s

cargo run

С ним мы уже знакомы: компилирует и сразу запускает. Всё, что умеет cargo build, плюс запуск результата. В повседневной работе используется чаще остальных.

cargo fmt

Форматирует исходный код по стандарту Rust. Не нужно думать об отступах, пробелах вокруг операторов или длине строк - cargo fmt расставит всё само.

cargo fmt

Команда ничего не выводит, если форматировать нечего. Иначе - молча исправляет файлы. Запускать стоит перед каждой проверкой: читающий замечает форматирование раньше, чем смысл.

cargo clippy

Запускает линтер - инструмент, который ищет не ошибки, а плохие привычки: неидиоматичные конструкции, подозрительные паттерны, вещи, которые работают, но могут работать лучше.

cargo clippy
    Checking tq v0.1.0 (.../tq)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s

Пока в tq одна строка, Clippy промолчит. Это изменится.

Результат

Cargo перестал быть чёрным ящиком. У него пять команд, каждая с назначением: check, build, run, fmt, clippy. Теперь их можно звать по имени.

Код tq в этой главе не изменился - мы только изучаем навыки фамильяра. Для единообразия он всё же лежит в 0-the-workshop/03-the-familiar/.


Lore: папка target/

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

cargo new создаёт .gitignore вместе с проектом. Там уже есть нужная строка:

/target

Ничего дополнительно делать не нужно. Если файл по какой-то причине отсутствует - восстанови его вручную.


Lore: настройка форматирования

cargo fmt следует стандартным правилам - и для большинства проектов этого достаточно. Если нужно что-то изменить, создай файл rustfmt.toml в корне проекта. Там можно задать, например, максимальную длину строки:

max_width = 120

Полный список параметров выводит rustfmt --help=config. Большинство команд никогда не открывают этот файл - стандарт достаточно хорош, чтобы не спорить с ним.