[Из песочницы] Настройка VSCode для работы с Scala

udyhjpz93gmj1miboy94qfnquug.png


Статья рассчитана на новичков в программировании на Scala, каким я сам и являюсь, и просто на желающих начать писать программный код в VSCode.

Так получилось, что единственным гайдом по теме работы со Scalой в Visial Studio Сode оказалось это видео на ютуб-канале DevInsideYou. В нем очень подробно описан процесс установки и настройки среды для VS Code и Sublime Text.

Данная статья — адаптация видео с какими-то добавлениями от меня. Вы можете перейти к просмотру видео или продолжить читать эту статью (либо сделать и то, и другое), в таком случае, надеюсь, она будет вам полезна.


Первое, что нам необходимо сделать, это установить саму Scalу, а также систему сборки проектов SBT, если вы ещё этого не сделали.

vzn9njbeqlfdbv3e9mcr9ud0awo.png


Для работы с Scala в VSCode есть расширение Metals.

  • Точная диагностика при сохранении:
    zp3nmzpaqbpoqvav4hts5oah3gy.gif
  • Переход к определению и всплывающая справка по наведению:
    4zupjgcbu3kin3bakjcxrwwwtbg.gif
  • Определение типа:
    jtpmpscatkzbrlzjtvxi6fhytnu.gif
  • Автодополнение при наборе:
    u3hcfqlsziwdk6s641y0kxxyzqs.gif


Здесь перечислен только базовый функционал, за более детальным описанием проследуйте в документацию.

Ниже представлен фрагмент из видео DevInsideYou, демонстрирующий процесс взаимодействия Scala c редакторами кода:

97apcq9i-6gev3zqlxckyp3dexq.png


Протокол языкового сервера — используется между клиентским инструментом (IDE) и серверами, которые предоставляют функции, специфичные для языка программирования (автодополнение, переход к определению и т.д.).

Metals = Meta (от Scalameta) + LS (от Language Server — стандартный протокол языкового сервера).

LSP позволяет уменьшить сложность m-times-n, обеспечивая высокий уровень поддержки любого языка программирования в любом редакторе, IDE или клиентской конечной точке, до более простой задачи m-plus-n. LSP был создан Microsoft для определения общего языка, на котором могут говорить анализаторы языка программирования. Microsoft Visual Studio Code поддерживает данный протокол «из коробки».

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


1 способ


Инициализация через scala файл. Для этого необходимо открыть папку проекта и создать в нем следующую дефолтную структуру:

qlybdw7047puupann6liuluh_qk.png


Примерный вывод после первого запуска Metals:

wk2gu1zh7hxxzc8hcnjhfnwomoq.png

2 способ


Второй способ подразумевает использование mill. Для этого необходимо создать в папке проекта файл build.sc и открыть его.

Примерный вывод после первого запуска Metals:

7iwvjw8sfucsti6d4qf57ctdd44.png


3 способ (финальный)


Инициализация средствами SBT. Создадим файл build.sbt в папке проекта со следующим содержанием:

name := "scala-vscode-example"

version := "0.1"

scalaVersion := "2.13.1"

triggeredMessage := Watched.clearWhenTriggered

autoStartServer := false

scalacOptions ++= Seq(
  "-feature",
  "-deprecation",
  "-language:implicitConversions",
  "-language:higherKinds"
)

addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.10.3")


Примерный вывод после первого запуска Metals:

vsehesdbrw347yv5q7jysbo0jai.png


Когда Metals обнаруживает sbt-рабочее пространство, для которого нет project/build.properties, появляется всплывающее уведомление с рекомендацией обновиться до 0.13.7:

1ekvib0baws9ztdn_1qgn21_mhs.png


Тут рекомендуют использовать sbt версии 1.2.8. Для изменения версии sbt внесите следующие правки в файл project/build.properties:

y9x6hkkza3lkufdapkhrs1udn5m.png


Для проверки версии sbt используйте команду:

$ sbt sbtVersion


Инициализируем рабочую среду sbt в папке проекта:

$ sbt


Для импорта проекта нажмите кнопку Import build в появившемся уведомлении или введите команду:

cmohvnif2_ac0m9nyqbr0nwsjde.png


После внесения изменений в любой scala файл Metals будет автоматически компилировать его:

itbutjryxtuwvo3rwjj3ud6u_oc.png


Доктор


Используется для устранения потенциальных проблем конфигурации сборки. Для запуска используйте:

cucvwfxcxhfcg6gzfuznspsurly.png


Вывод:

2__-cekolux4pys9yms_lyulgig.png


Bloop — это сервер сборки и инструмент CLI для Scala, который работает с SBT и имеет экспериментальную поддержку для других инструментов сборки, таких как Maven, Gradle и Mill. Если ваше рабочее пространство содержит .bloop каталог с файлами Bloop JSON, Metals автоматически подключится к нему.

Преимущества Bloop:

  • Компилирует, тестирует и запускает Scala-код максимально быстро. Компиляция происходит автоматически при изменении исходного программного кода, запуск и тестирование программы не требуют повторной компиляции;
  • Легко интегрируется с инструментами сборки, приложениями командной строки, редакторами и пользовательскими инструментами;
  • Запускается отдельно от IDE, поэтому не зависит от ее завершения или перезагрузки;
  • Ускоряет открытии проекта, так как Metals не нужно запускать встроенный сервер за вас.


На следующем фрагменте из видео «Happy Life With Scala Metals» показан процесс сборки приложения:

cgwvlqay_wnrorqtavwgrx-bae0.png


Примечание: на рисунке присутствуют некоторые неточности. Пользователь Gabriele Petronella указывает на них в своем комментарии под видео:

На рисунке нижние стрелки BSP неправильны с технической точки зрения. Как вы (правильно) указали, если инструмент построения говорит на BSP, он может интегрироваться напрямую с металлами, не проходя через Bloop. Переход от инструмента сборки к Bloop — это способ добавить интеграцию BSP в сам инструмент сборки, и это специальный шаг, не использующий BSP. Более подробную информацию можно найти здесь.

Bloop интегрируется с IDE и текстовыми редакторами, обеспечивая короткий цикл обратной связи и надежную диагностику компилятора.

Bloop используется в Metals двумя возможными способами:

  1. Если Bloop установлен на вашем компьютере, Metals просто подключится к существующему серверу сборки (рекомендуется);
  2. Если Bloop не установлен, сервер Metals загрузит его и запустит во встроенном режиме.


SemanticDB — это модель данных для семантической информации, такой как символы и типы, о программах на Scala и других языках. После компиляции проекта, sbt-metals отправляет информацию в локальную базу данных semanticdb-scala.

Установка bloop


Для начала скачаем последнюю версию:

$ curl -L https://github.com/scalacenter/bloop/releases/download/v1.3.2/install.py | python


Далее необходимо создать копию сервиса bloop для текущего пользователя:

$ cp ~/.bloop/systemd/bloop.service ~/.config/systemd/user/


Также чтобы постоянно не прописывать путь до скрипта, можно скопировать bloop в /usr/bin:

$ sudo cp /.bloop/bloop /usr/bin/


Перезагрузите systemctl демона:

$ systemctl --user daemon-reload


Добавление bloop в автозагрузку:

$ systemctl --user enable bloop


Однако, если вы не собираетесь работать с Scala постоянно, я не рекомендую убрать данный сервис из автозагрузки. Отключить автозапуск можно следующей командой:

$ systemctl --user disable bloop


Запуск bloop:

$ systemctl --user start bloop


Вывод информации о текущем соединении:

2dopu_ogqgc33prjjeccf7leylw.png


Когда bloop сервис работает вы можете запускать вашу скомпилированную программу с помощью данной команды в директории проекта:

$ bloop run 


Также можно добавить горячую клавишу в ~/.config/Code/User/keybindings.json :

 {
    "key": "meta+r",
    "command": "workbench.action.terminal.sendSequence",
    "args": {
      "text": "bloop run ${workspaceFolderBasename}\u000D"
    }
 }


Если у вас не запущен bloop сервис, вы можете запускать приложение напрямую через sbt, однако, в таком случае, приложение будет каждый раз перекомпилироваться, что скажется на времени запуска программы:

$ sbt run


Небольшой тестовый пример scala проекта лежит в этом репозитории на github. Если вы также будете хранить свои проекты, не забудьте добавить следующий список исключений в файл .gitignore:

*.class
*.log
project/
target/
.bloop/
.metals/

© Habrahabr.ru