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

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

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

Установка


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


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

Возможности Metals


  • Точная диагностика при сохранении:
  • Переход к определению и всплывающая справка по наведению:
  • Определение типа:
  • Автодополнение при наборе:

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

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


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

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

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

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

Инициализация проекта


1 способ


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


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



2 способ


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

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


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:


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


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


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

$ sbt sbtVersion

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

$ sbt

Импорт проекта


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


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


Доктор


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


Вывод:


Bloop


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

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

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

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


Примечание: на рисунке присутствуют некоторые неточности. Пользователь 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

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



Запуск приложения


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

$ bloop run <proj-name>

Также можно добавить горячую клавишу в ~/.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/