Пишем с комфортом на Rust в Visual Studio Code +6


Хочешь писать на Rust, но не знаешь в чём?

Нет денег на CLion или Intellij Ultimate, но тебе нужно отлаживать код?

Очень нравится Visual Studio Code, но при виде десятков плагинов разбегаются глаза?

Если на любой из вопросов выше ты ответил "да", то эта статья для тебя.


Disclaimer

Во многом эта статья обращена мне самому в прошлом, когда я долго мучался с настройкой vscode и плевался от кучи конфликтов и непонятных ошибок.

На данный момент я использую CLion с плагином Intellij Rust

А, ну и это моя первая статья в принципе, так что любая критика и вопросы приветствуются.

Устанавливаем тулчейн

Это самое простое, и при этом самое важное, без этого не получится собрать твой прекрасный код.

  1. Скачай и установи Инструменты сборки для Visual Studio отсюда:

    Листаем вниз до пункта "Инструменты для Visual Studio 2022"
    Листаем вниз до пункта "Инструменты для Visual Studio 2022"
    Нам нужная самая последняя кнопка, напротив "Инструменты сборки для Visual Studio 2022"
    Нам нужная самая последняя кнопка, напротив "Инструменты сборки для Visual Studio 2022"
    После запуска и некоторого ожидания откроется Visual Studio Installer
В нём нам нужен пункт "Разработка классических приложений на C++"
    После запуска и некоторого ожидания откроется Visual Studio Installer В нём нам нужен пункт "Разработка классических приложений на C++"

    При каждом запросе на перезагрузку - перезагружайся.

  2. Скачай и установи rustup-init отсюда: https://rustup.rs/
    При его запуске появится окно консоли со следующим содержанием:

    Welcome to Rust!
    
    This will download and install the official compiler for the Rust
    programming language, and its package manager, Cargo.
    
    Rustup metadata and toolchains will be installed into the Rustup
    home directory, located at:
    
      C:\Users\Vabka\.rustup
    
    This can be modified with the RUSTUP_HOME environment variable.
    
    The Cargo home directory located at:
    
      C:\Users\Vabka\.cargo
    
    This can be modified with the CARGO_HOME environment variable.
    
    The cargo, rustc, rustup and other commands will be added to
    Cargo's bin directory, located at:
    
      C:\Users\Vabka\.cargo\bin
    
    This path will then be added to your PATH environment variable by
    modifying the HKEY_CURRENT_USER/Environment/PATH registry key.
    
    You can uninstall at any time with rustup self uninstall and
    these changes will be reverted.
    
    Current installation options:
    
    
       default host triple: x86_64-pc-windows-msvc
         default toolchain: stable (default)
                   profile: default
      modify PATH variable: yes
    
    1) Proceed with installation (default)
    2) Customize installation
    3) Cancel installation
    >1

    Тут тебе ничего не надо менять - просто пиши 1 и жми [Enter].
    После этого тебе установится cargo и rustc, с помощью которых ты сможешь собирать код из консоли.

Устанавливаем и настраиваем Visual Studio Code

Предположим, что ты уже установил vs code: https://code.visualstudio.com/

Теперь нам нужно научить его работать с Rust, это делается при помощи расширений.
Нам понадобятся расширения для подсветки синтаксиса и автодополнений, отладки, и что-то ещё для комфортного редактирования cargo.toml.

Для подсветки синтаксиса и автодополнений есть два наиболее популярных расширения: Rust и rust-analyzer. Они работают немного по-разному и конфликтуют между собой. Я не буду глубоко разбирать, в чём у них различия, но rust-analyzer работает лучше, потому берём его.

Для отладки устанавливаем CodeLLDB.

Для работы с toml ставим Even Better TOML (для подсветки), crates (для удобного обновления зависимостей), и crates completer (для автодополнения имён пакетов и версий)

Также, тебе может пригодится Test Explorer UI и Rust Test Explorer для того чтобы запускать тесты из боковой панели, а не из консоли.

Проверяем всё вместе

Создаём пустой проект в консоли

mkdir rust-demo # создаём папку rust-demo
cd rust-demo # переходим в неё
cargo init # инициализируем в ней минимальный проект
code . ./src/main.rs # открываем vscode
В результате у тебя откроется vscode с твоим проектом
В результате у тебя откроется vscode с твоим проектом

Для того чтобы просто запустить - нажимай Run.

Для того чтобы запустить в режиме отладки - жми Debug.

Также можно создать launch.json через раздел Run and Debug (четвёртая иконка на боковой панели на скриншоте).

UPD1: Спасибо @TrueBersза поправку, что Better TOML устарел, и вместо него надо использовать Even Better TOML




Комментарии (35):

  1. dark_ruby
    /#23945225 / +1

    хотелось бы плагин для VSCode умеющий упорядочивать import (use statement) так же легко и непренужденно как это сделано для TypeScript, JS и так далее

    • vabka
      /#23945247

      В rust-analyzer есть функция для объединения импортов и удаления лишних.
      Или нужно что-то типа группировки и сортировки по алфавиту?

  2. ertaquo
    /#23945303

    Попробовал недавно Rust, теперь интересно: как на нем действительно можно писать с комфортом? Куча кода просто генерируется через derive, этот сгенерированный код не подцепляется к анализу и автодополнению ни в плагине к VSCode, ни в плагине к IntelliJ.

    • vabka
      /#23945347 / +5

      Похоже на баг.
      У меня нормально подсвечивается всё что приходит из дерайвов и макросов. (и с rust-analyzer и с Intellij-Rust)

      • cy-ernado
        /#23950095

        И даже https://github.com/diesel-rs/diesel подсвечивается? Ничего себе!

        А можете, пожалуйста, показать?

        • vabka
          /#23950327

          Дизель не пробовал ещё. Сейчас попробую

        • vabka
          /#23951403 / +1

          Было тяжело, но я завёл дизель.
          Правда не полностью — всё ещё хз как победить use of undeclared crate or module при derive(Insertable)

          Итог:
          в vscode есть подсветка дизелевского DSL-а для описания таблиц (который table!).
          Вероятно, это заслуга rust-analyzer.

          И в vscode и в intellij работает авто-импорт и автокомплит всего что там макросы нагенерили.

    • Sulerad
      /#23946311 / +1

      Основные случаи (derive из std и serde) плагины давно умеют обрабатывать специально и просто понимают что трейт как-то реализуется. Для более сложных случаев есть возможность экспериментально раскрывать proc-macro, но это работает не всегда и не совсем стабильно.

  3. IkaR49
    /#23945341

    Для того чтобы просто запустить - нажимай Run.

    Для того чтобы запустить в режиме отладки - жми Debug.

    Также можно создать launch.json через раздел Run and Debug (четвёртая иконка на боковой панели на скриншоте).

    Хех. Вот как раз на этом у меня и был затык (не работает отладка, и с launch.json я так и не разобрался в принципе). А всё остальное, что описано - прекрасно очевидно из советов rustup-init и подсказок самого VS Code, когда впервые открываешь rust-проект.

    • vabka
      /#23945351 / +1

      А как именно не работала отладка?
      У меня аналогичные проблемы были с официальным Rust-екстеншеном, а на r-a наоборот всё из коробки отлично работает.
      И launch.json и линза около main.

      • IkaR49
        /#23945395 / +1

        Просто берет и не работает. Отладчик нашелся, приложение запускается, но в обычном режиме выполнения. Глубже разбираться лень, он особо не нужен, да и от VS Code я в принципе ухожу уже.

        • vabka
          /#23945415

          Магия, что тут сказать)

          У меня такое тоже было и решалось только полной чисткой всего и вся

        • lostmsu
          /#23945521 / +1

          Я, кстати, думал, что CLion будет лучше в качестве отладчика, взял пробную версию, но никаких преимуществ перед CodeLLDB не заметил.

  4. TrueBers
    /#23945707 / +17

    Хабр -- для аутистов!

    Когда будут туториалы "Как включить компьютер", "Как установить Виндавс"?

    Если уж на то пошло, то советуйте Even Better TOML вместо Better TOML, который заброшен и не поддерживается уж 4 года как.

    Для подсветки синтаксиса и автодополнений есть два наиболее популярных расширения: Rust и rust-analyzer. Они работают немного по-разному и конфликтуют между собой. Я не буду глубоко разбирать, в чём у них различия, но rust-analyzer работает лучше, по тому берём его.

    Различия у них в том, что vscode-rust больше года назад забросили, а позже вообще объявили deprecated в RFC2912. Оно не "плохо работает", оно вообще больше не разрабатывается. rust-analyzer ожидается в stable toolchain вместо RLS.

  5. RC_Cat
    /#23945817 / +2

    А чтобы добавить ещё больше комфорта и удалить MSVC build tools который весит 4.2 Gb рекомендую установить Rust через MSYS2.

    А также это нужно тем кто хочет использовать Rust но не имеет лицензии на MSVC.

    • trolley813
      /#23946127

      Согласен, тянуть целую MSVC для этого (разработки на Rust) совсем не обязательно.

    • vabka
      /#23946479

      Если я не ошибаюсь, если компилировать с msys, то тому кто захочет твоим приложением воспользоваться — придётся тоже ставить msys.

      PS: у меня он почему-то весит 5.2гб, вместо 4.2

      • RC_Cat
        /#23946935

        тому кто захочет твоим приложением воспользоваться — придётся тоже ставить

        Cygwin

        у меня он почему-то весит 5.2гб, вместо 4.4.2

        Удалите не используемое.

        • vabka
          /#23946985

          Cygwin

          Немного не шарю. Если собирать с cygwin, то не потребителю не придётся его устанавливать? Не будет никаких зависимостей от всяких posix штук?

          • TrueBers
            /#23949521 / +2

            Если будет возможность слинковать статически, то не придётся. Например, HelloWorld слинковать можно.

            Но в серьёзных проектах такого почти не встретится, потому что GNU ABI предполагает динамическую линковку по умолчанию. Множество либ вообще не предназначено для статики. Натрахаетесь со всякими PIC, релоками, и прочими радостями линковки.

            Это всё -- если у вас нет рантайм ABI-bound взаимодействия, иначе -- много разнообразного секса будет.

    • snuk182
      /#23946605 / +1

      Двачую. Совершенно непонятно, почему на винде руступ предлагает по умолчанию msvc, а не mingw, который легкий и уже в комплекте.

      • TrueBers
        /#23949487 / +2

        Мб потому что в Винде используется Windows ABI, а не GNU'сный?

        Как вы предлагаете линковать либы, например, из современной SDK/WDK? Я вообще не уверен, что gnu бандл содержит адекватные хотя бы основные либы для виндовых фич. Последний раз, когда сталкивался пару лет назад, там было говно мамонта времён раннего pre SP3 Windows XP.

        Если вам достаточно gnu тулчейна, значит вы HelloWorld'ы компилите без внешних платформенных зависимостей. Ну или сраные блокчейны с бекендами, перекладывающими байтики, тоже вполне соберутся. А что-то полезное под современную 10/11 винду типа драйверов или системных утилит им никак не слинкуешь.

        gnu тулчейн под винду изначально создавался для кросс-компиляции, а не извращений.

        • snuk182
          /#23950173 / +1

          У меня есть большой проект на winapi. Есть проект поменьше на графику. Есть россыпь мелких проектов-библиотек. Ни в одном из них проблем с mingw нет. Возможно они появятся, если использовать непростые зависимости родных windows-библиотек. Но для этого нужно прям закапываться - Windows SDK собирается с mingw без видимых проблем. Требовать же целый msvc по умолчанию ради потенциальных "драйверов", когда вокруг 99% проектов - прикладные библиотеки, немного оверкилл.

          • TrueBers
            /#23954071

            Возможно, современная ситуация получше, но когда пару лет назад сталкивался, из своих проектов максимум 10% мог собрать gnu тулчейном без бубна.

            ПС. Сейчас погуглил. Похоже, что ситуация заметно лучше стала с появлением WLS, который явно поспособствовал развитию тулчейна. Во времена, когда я пытался, с этим был какой-то треш.

    • TrueBers
      /#23949571 / +1

      Да что ж всем так интересны сексуальные извращения.

      Как я написал в соседней ветке, gnu toolchain был создан в винде исключительно для кросскомпиляции. 4 гигабайта диска настолько дорого стоят, чтобы тратить нервы на боль и страдания?

      А также это нужно тем кто хочет использовать Rust но не имеет лицензии на MSVC.

      Для проектов с открытым кодом или команд до 5 человек лицензия на MSVC не нужна, что покрывает большинство потребностей.

  6. GinRummy
    /#23946697

    Спасибо за гайд, актуальная для меня тема.

    Такой вопрос - Насколько сильно отличается работа в силайн от вскода и почему все же решил перейти на платное решение? Я слышал версию от знакомого раст-разработчика, что в силайне плагин полумертвый.

    Также, ждём-с Fleet

    • vabka
      /#23946705 / +1

      Не знаю, на сколько он полумёртвый. Обновления периодически выходят.
      Перешёл из-за того что привык пользоваться intellij-based средами.

      Тоже жду fleet

    • easimonenko
      /#23947201

      Этот https://www.jetbrains.com/fleet/ аналог VSCode и Atom, только от JetBrains?

      • vabka
        /#23947471 / +2

        По сути да, но по идее должен быть пощнее, ибо:

        1. Может использовать движок от идеи или других jb-сред

        2. Архитектура изначально предполагает совместную работу и/или запуск движка или вообще всей среды где-то в облаке или на удалённой машине.

        3. Никакого электрона

        • easimonenko
          /#23947503

          Ещё заметил, что Fleet базируется на LSP и в этом отношении больше похож на Emacs с lsp-mode.

  7. KReal
    /#23947279

    VSCode работает с WSL2, так что теоретически можно поставить раст на убунту и не тащить MSVC.

    • vabka
      /#23947595

      Да, можно. На это даже намекает один из вариантов ответа в опросе)
      Разница будет только на этапе установки тулчейна.

      • KReal
        /#23948747

        Ну просто был тред в комментариях, где люди ругались на размер MSVC)
        UPD: А опрос не увидел, май фолт)

  8. de-dup-i-dipi
    /#23958129

    Еще бы новый файл автоматически ипортился в mod.rs при добавлении/предлагал добавить.