Настройка VSCode для работы с Scala

в 15:37, , рубрики: metals, scala, Visual Studio, vscode, настройка, Программирование, программрование
Настройка VSCode для работы с Scala - 1

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

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

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

Установка

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

Настройка VSCode для работы с Scala - 2

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

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

  • Точная диагностика при сохранении:
    Настройка VSCode для работы с Scala - 3
  • Переход к определению и всплывающая справка по наведению:
    Настройка VSCode для работы с Scala - 4
  • Определение типа:
    Настройка VSCode для работы с Scala - 5
  • Автодополнение при наборе:
    Настройка VSCode для работы с Scala - 6

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

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

Настройка VSCode для работы с Scala - 7

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

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

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

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

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

1 способ

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

Настройка VSCode для работы с Scala - 8

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

Настройка VSCode для работы с Scala - 9

2 способ

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

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

Настройка VSCode для работы с Scala - 10

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:

Настройка VSCode для работы с Scala - 11

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

Настройка VSCode для работы с Scala - 12

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

Настройка VSCode для работы с Scala - 13

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

$ sbt sbtVersion

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

$ sbt

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

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

Настройка VSCode для работы с Scala - 14

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

Настройка VSCode для работы с Scala - 15

Доктор

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

Настройка VSCode для работы с Scala - 16

Вывод:

Настройка VSCode для работы с Scala - 17

Bloop

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

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

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

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

Настройка VSCode для работы с Scala - 18

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

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

Настройка VSCode для работы с Scala - 19

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

Когда 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/

Автор: BlasterAlex

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js