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. Большинство команд никогда не
открывают этот файл - стандарт достаточно хорош, чтобы не спорить с ним.