
Статья рассчитана на новичков в программировании на 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 двумя возможными способами:
- Если Bloop установлен на вашем компьютере, Metals просто подключится к существующему серверу сборки (рекомендуется);
- Если 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/
