Статья рассчитана на новичков в программировании на 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/

Комментарии (3)


  1. george3
    02.10.2019 18:05

    Дебагер так и не завезли?


    1. BlasterAlex Автор
      03.10.2019 07:20

      К сожалению, пока нет


      1. fshp
        04.10.2019 01:50

        Ну собственно на этом мое знакомство с metals и закончилось. Подождем еще пару лет.