[Из песочницы] Настройка VSCode для работы с Scala
Статья рассчитана на новичков в программировании на Scala, каким я сам и являюсь, и просто на желающих начать писать программный код в VSCode.
Так получилось, что единственным гайдом по теме работы со Scalой в Visial Studio Сode оказалось это видео на ютуб-канале DevInsideYou. В нем очень подробно описан процесс установки и настройки среды для VS Code и Sublime Text.
Данная статья — адаптация видео с какими-то добавлениями от меня. Вы можете перейти к просмотру видео или продолжить читать эту статью (либо сделать и то, и другое), в таком случае, надеюсь, она будет вам полезна.
Первое, что нам необходимо сделать, это установить саму Scalу, а также систему сборки проектов SBT, если вы ещё этого не сделали.
Для работы с Scala в VSCode есть расширение 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 — это сервер сборки и инструмент 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
Также можно добавить горячую клавишу в ~/.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/