Под новогодние праздники был выпущен Rust 1.5. Так как близится релиз 1.6, хочу наверстать упущенное, и рассказать о том, что появилось в последней стабильной версии. Существенные изменения затронули Cargo!

Основное изменение, которое вы получите — это команда 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

Вот что получилось:

image

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)


  1. ozkriff
    15.01.2016 12:55
    +2

    > Всё её прелесть в возможности установить внешние плагины на ваш cargo.

    Не только плагины же, а любые приложения с crates.io (где в cargo.toml есть bin-секция).


  1. grossws
    15.01.2016 13:13

    Нормально ли живёт с multirust?


    1. kstep
      15.01.2016 13:29
      +1

      Да, вполне. Главное, чтобы эти пакеты были установлены в ту же среду, в которой их пытаются запустить.


  1. Gorthauer87
    15.01.2016 14:04

    А как обновлять-то установленные приложения?


    1. ozkriff
      15.01.2016 14:15
      +1

      Удалить и поставить заново. Но какие-то планы на нормальный способ, вроде, есть — https://github.com/rust-lang/cargo/issues/2082


  1. ababo
    15.01.2016 16:15
    +2

    Команда fmt позволяет автоматически форматировать код. Близкий аналог есть в Go.
    Скажем УРА, товарищи!


    1. kstep
      15.01.2016 16:24

      И ещё у неё есть конфиг!
      github.com/rust-lang-nursery/rustfmt#configuring-rustfmt


      1. ababo
        15.01.2016 19:54
        -7

        А вот это как раз не радует. Нельзя разрешать разные стили форматирования.


        1. kstep
          15.01.2016 21:07
          +3

          Категорически не согласен. Разные проекты/команды имеют полное право устанавливать свои стандарты кодирования. Или 640Кб одного формата хватит на всех? По дефолту форматирование настроено на то, что использует core team, так что проще всего использовать его из коробки. Но если команда решит для своего проекта подправить какие-то мелочи, она может это сделать. И положить rustfmt.conf в репозиторий, так что все члены команды смогут поддерживать одинаковое форматирование, просто запуская cargo fmt перед коммитом.


          1. ababo
            15.01.2016 21:14

            Вашими устами да мёд пить. Кроме команды, которую можно надрессировать выбранному стилю (что тоже не всегда удаётся), будет ещё и весь остальной мир, библиотеки которого нужно будет подключать к проекту. И получится как в C++, шаг вправо — шаг влево, в сторону сторонней библиотеки — и перед тобой разверзается портал в другой мир…


            1. kstep
              15.01.2016 21:16
              +2

              А какая, извините, мне разница, как отформатирован код у библиотеки, которую я просто прописал в Cargo.toml? Абсолютно пофиг. Ибо заглядывать я туда буду дай бог раз в год. Если и потребуется лезть в сторонний код, то только если там какой-то баг, но только для того, чтобы запостить багрепорт или PR. Что бывает не так уж часто.


              1. ababo
                15.01.2016 21:21
                -1

                Не знаю… но опыт Golang и ядра Linux говорит в пользу единого стиля форматирования.


                1. kstep
                  15.01.2016 21:31
                  +3

                  Решение Go в этом плане вообще граничит с диктатурой (никакой подсветки синтаксиса! один стандарт кодирования на всех!). Совершенно другая идеология, по сравнению с растом. Да, можно, конечно, вспомнить про питон и PEP8, но этот пеп носит рекомендательный характер, проверяльные утилиты гибко настраиваются под стандартны любой команды (PEP8 по дефолту), так что в этом плане питон ближе к расту. В общем прокрустово ложе go fmt скорее исключение из правил.

                  Linux — самостоятельный проект со своим стилем форматирования, про что я и говорил: внутри проекта команда может устанавливать любые стандарты. Но они же не навязывают свои стандартны всем, кому попало (понятно, что если хочешь контрибутить в проект, то должен выполнять командные правила, но если нет, то ты волен сам решать, как писать на Си).

                  Так что оба примера мимо кассы.


                  1. kstep
                    15.01.2016 22:05
                    +2

                    Да, не путайте подключаемые сторонние библиотеки, и код, который контрибутиться ко мне в проект. Если мне в какой-то мой проект придёт PR с новой фичей/багфиксом, то это претендент на включение в мой код, и должен соответствовать правилам проекта. Если я включаю стороннюю библиотеку как зависимость, то это чужой код, и автор библиотеки мне ничего не должен. В общем принцип простой: не лезь в чужой монастырь со своим уставом, и в Тулу со своим самоваром.


            1. kstep
              15.01.2016 21:18
              +2

              Дрессировать никого не нужно. Есть тулза, которая всё приводит в нужный вид. Всё, что нужно, сказать членам команды запускать cargo fmt перед коммитом. Или вообще повесить на git/hg хук. Всё. Нулевые накладные расходы.


  1. kstep
    15.01.2016 17:08

    Немного срывает шаблон расширение .exe у бинарников в листинге явно с линуксовой машины.
    Кросс-компиляция?


    1. Monnoroch
      15.01.2016 17:32

      Я думаю, что это какой-то шелл для виндоуса.
      Машина явно виндусовая:

      mould path: «C:\\DEVELOPMENT\\rust-dev\\mould»


    1. 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. Ни разу не возникли проблемы с переносимостью. Оба варианта компилируются как родные.