Основное изменение, которое вы получите — это команда cargo install. Её прелесть в возможности установить внешние плагины на ваш cargo. Список доступных расширений можно посмотреть здесь, крейты с плагинами чаще всего имеют префикс cagro-. Приведу пример использования нескольких их них.
cargo-check
Команда check позволяет проверить код, без сборки. Устанавливаем:
cargo install cargo-check
Использовать очень просто, точно так же как вы используете команду build:
cargo check
Команда выводит все предупреждения и ошибки по исходникам Rust вашего проекта.
cargo-edit
Команда edit позволяет управлять зависимостями. Устанавливаем:
cargo install cargo-edit
На самом деле будет установлено сразу 3 команды: add, rm и list. Используем следующим образом:
cargo list
env_logger ~0.3
hyper ~0.7
json_macro 0.1.1
log ~0.3
lua git: "https://github.com/jcmoyer/rust-lua53"
mould path: "C:\\DEVELOPMENT\\rust-dev\\mould"
r2d2 0.6.3
r2d2_sqlite 0.0.4
rusqlite 0.6.0
rust-crypto 0.2.34
rustc-serialize ~0.3.16
static-server path: "C:\\DEVELOPMENT\\rust-dev\\static-server"
uuid 0.1.18
Добавляем зависимость с помощью:
cargo add <crate> [--dev|--build|--optional] [--vers=<ver>|--git=<uri>|--path=<uri>] [options]
cargo-graph
Команда graph генерирует граф зависимостей в формате GraphViz. Возможно вы уже видели подобное в некоторых библиотеках на Rust. Устанавливаем:
cargo install cargo-graph
Граф генерируется в stdout, поэтому укажите название файла:
cargo graph > deps.dot
После генерируем PNG из DOT файла:
dot deps.dot -Tpng -o deps.png
Вот что получилось:
cargo-watch
Команда watch позволяет автоматически собирать код, при изменениях в файлах. Подобный подход очень популярен в мире Node (Grunt, Gulp). Устанавливаем:
cargo install cargo-watch
Использовать так же просто:
cargo watch
По сути команда запускает бесконечный цикл с командами build и test, просто наблюдающий за изменениями в файлах.
Кстати, по всем командам можно получить справку через команду help, например:
cargo help watch
Usage: cargo-watch [watch] [options]
cargo watch [options]
cargo-watch [watch] [<args>...]
cargo watch [<args>...]
Options:
-h, --help Display this message
`cargo watch` can take one or more arguments to pass to cargo. For example,
`cargo watch "test ex_ --release"` will run `cargo test ex_ --release`
If no arguments are provided, then cargo will run `build` and `test`
cargo-count
Команда count позволяет посчитать полезную статистику о вашем коде. Устанавливаем:
cargo install cargo-count
Просто наберите:
cargo count
И получите следующий отчёт (меня он приводит в полный восторг!):
Gathering information...
Language Files Lines Blanks Comments Code
-------- ----- ----- ------ -------- ----
TOML 1 19 1 0 18
Python 1 63 11 5 47
Rust 7 824 89 17 718
HTML 41218 5218543 1016734 239837 3961972
CSS 5 907 130 38 739
C 37 19303 2665 1964 14673
C Header 25 3970 1049 1012 1907
C++ Header 1 9 1 3 5
JavaScript 788 4024 591 155 3278
-------- ----- ----- ------ -------- ----
Totals: 42083 5247662 1021271 243031 3983357
rustfmt
Команда fmt позволяет автоматически форматировать код. Близкий аналог есть в Go. Устанавливаем:
cargo install rustfmt
Команда довольно долго компилируется, и пока не очень стабильна, но уже очень полезна.
Наберите:
cargo fmt
Помогает отформатировать код и показывает все не сделанные TODO.
Итог
Теперь вы можете значительно повысить удобство и без того прекрасного cargo. Перспектива радует.
P.S. К слову, все команды — полноценные и автономные программы на Rust, которые компилируются и складываются в ~/.cargo/bin/:
ls -lah ~/.cargo/bin/
итого 33M
drwxr-xr-x 1 denis_000 denis_000 0 янв 15 12:17 .
drwxr-xr-x 1 denis_000 denis_000 0 дек 15 16:37 ..
-rwxr-xr-x 1 denis_000 denis_000 3,5M янв 15 12:13 cargo-add.exe
-rwxr-xr-x 1 denis_000 denis_000 2,2M янв 15 12:04 cargo-check.exe
-rwxr-xr-x 1 denis_000 denis_000 3,3M дек 15 16:44 cargo-count.exe
-rwxr-xr-x 1 denis_000 denis_000 2,4M янв 15 12:03 cargo-fmt.exe
-rwxr-xr-x 1 denis_000 denis_000 3,1M янв 15 12:17 cargo-graph.exe
-rwxr-xr-x 1 denis_000 denis_000 3,2M янв 15 12:13 cargo-list.exe
-rwxr-xr-x 1 denis_000 denis_000 3,2M янв 15 12:12 cargo-rm.exe
-rwxr-xr-x 1 denis_000 denis_000 3,3M дек 15 16:37 cargo-watch.exe
-rwxr-xr-x 1 denis_000 denis_000 8,4M янв 15 12:03 rustfmt.exe
Комментарии (18)
Gorthauer87
15.01.2016 14:04А как обновлять-то установленные приложения?
ozkriff
15.01.2016 14:15+1Удалить и поставить заново. Но какие-то планы на нормальный способ, вроде, есть — https://github.com/rust-lang/cargo/issues/2082
ababo
15.01.2016 16:15+2Команда fmt позволяет автоматически форматировать код. Близкий аналог есть в Go.
Скажем УРА, товарищи!kstep
15.01.2016 16:24И ещё у неё есть конфиг!
github.com/rust-lang-nursery/rustfmt#configuring-rustfmtababo
15.01.2016 19:54-7А вот это как раз не радует. Нельзя разрешать разные стили форматирования.
kstep
15.01.2016 21:07+3Категорически не согласен. Разные проекты/команды имеют полное право устанавливать свои стандарты кодирования. Или
640Кбодного формата хватит на всех? По дефолту форматирование настроено на то, что использует core team, так что проще всего использовать его из коробки. Но если команда решит для своего проекта подправить какие-то мелочи, она может это сделать. И положить rustfmt.conf в репозиторий, так что все члены команды смогут поддерживать одинаковое форматирование, просто запуская cargo fmt перед коммитом.ababo
15.01.2016 21:14Вашими устами да мёд пить. Кроме команды, которую можно надрессировать выбранному стилю (что тоже не всегда удаётся), будет ещё и весь остальной мир, библиотеки которого нужно будет подключать к проекту. И получится как в C++, шаг вправо — шаг влево, в сторону сторонней библиотеки — и перед тобой разверзается портал в другой мир…
kstep
15.01.2016 21:16+2А какая, извините, мне разница, как отформатирован код у библиотеки, которую я просто прописал в Cargo.toml? Абсолютно пофиг. Ибо заглядывать я туда буду дай бог раз в год. Если и потребуется лезть в сторонний код, то только если там какой-то баг, но только для того, чтобы запостить багрепорт или PR. Что бывает не так уж часто.
ababo
15.01.2016 21:21-1Не знаю… но опыт Golang и ядра Linux говорит в пользу единого стиля форматирования.
kstep
15.01.2016 21:31+3Решение Go в этом плане вообще граничит с диктатурой (никакой подсветки синтаксиса! один стандарт кодирования на всех!). Совершенно другая идеология, по сравнению с растом. Да, можно, конечно, вспомнить про питон и PEP8, но этот пеп носит рекомендательный характер, проверяльные утилиты гибко настраиваются под стандартны любой команды (PEP8 по дефолту), так что в этом плане питон ближе к расту. В общем прокрустово ложе go fmt скорее исключение из правил.
Linux — самостоятельный проект со своим стилем форматирования, про что я и говорил: внутри проекта команда может устанавливать любые стандарты. Но они же не навязывают свои стандартны всем, кому попало (понятно, что если хочешь контрибутить в проект, то должен выполнять командные правила, но если нет, то ты волен сам решать, как писать на Си).
Так что оба примера мимо кассы.kstep
15.01.2016 22:05+2Да, не путайте подключаемые сторонние библиотеки, и код, который контрибутиться ко мне в проект. Если мне в какой-то мой проект придёт PR с новой фичей/багфиксом, то это претендент на включение в мой код, и должен соответствовать правилам проекта. Если я включаю стороннюю библиотеку как зависимость, то это чужой код, и автор библиотеки мне ничего не должен. В общем принцип простой: не лезь в чужой монастырь со своим уставом, и в Тулу со своим самоваром.
kstep
15.01.2016 21:18+2Дрессировать никого не нужно. Есть тулза, которая всё приводит в нужный вид. Всё, что нужно, сказать членам команды запускать cargo fmt перед коммитом. Или вообще повесить на git/hg хук. Всё. Нулевые накладные расходы.
kstep
15.01.2016 17:08Немного срывает шаблон расширение .exe у бинарников в листинге явно с линуксовой машины.
Кросс-компиляция?Monnoroch
15.01.2016 17:32Я думаю, что это какой-то шелл для виндоуса.
Машина явно виндусовая:mould path: «C:\\DEVELOPMENT\\rust-dev\\mould»
deko
15.01.2016 17:40Это Windows + MSYS2. Раньше использовал VisualStudio, чтобы отлаживать C, всё перенёс на Rust, теперь Win не требуется.
Хотя в Linux всё же удобнее. Например, Ctrl+C не всегда корректно обрабатывается. Если запустить cargo run, прервать выполнение сервера нельзя, приходится в диспетчере отлавливать, потому привык к паре:
cargo build && RUST_LOG=debug ./target/debug/main.exe
Тем не менее сборка и продакшн у меня в EC2 на CentOS. Ни разу не возникли проблемы с переносимостью. Оба варианта компилируются как родные.
ozkriff
> Всё её прелесть в возможности установить внешние плагины на ваш cargo.
Не только плагины же, а любые приложения с crates.io (где в cargo.toml есть bin-секция).