やること
- Scala用のビルドツールsbtを入れる
- VSCodeでIDEっぽくするためにMetalsプラグインを入れる
あらかじめ用意するもの
- JDK (versionは8か11が推奨、筆者はAdoptOpenJDKの11を入れています)
- Scala
- VSCode
sbtの導入
sbtとは
Scala用のコマンドラインビルドツールです。一応、GradleやMavenでもScalaのコンパイルを行うプラグインは提供されていますが、sbtはLightbend社(Scalaを提供している会社)に所属するエンジニアがScalaコアチームと連携しながら精力的に開発しているツールらしいです。
インストール
こちらの公式DLサイトからダウンロードできます。
-
Windowsでインストール
上記のDLサイトにzip、tgz、msiインストーラが置いてあります。 -
MacOSでインストール
Homebrewを使ってbrew install sbt
を実行するのが一番早いです。
ちなみに、sbtの導入についてはScalaの公式ドキュメントでも紹介されています。
→ コマンドラインの sbt で Scala を始める
sbtシェルの起動
$ sbt
サブコマンドを指定せずにsbtコマンドを実行すると、依存ライブラリの読み込み等の処理が走った後にsbtシェルが立ち上がります。
適当な場所でsbtコマンドを打った例です。
$ sbt
[warn] No sbt.version set in project/build.properties, base directory: /path/to/sample/sample-project
[info] Set current project to sample (in build file:/path/to/sample/sample-project/)
[info] sbt server started at local:///path/to/sample/.sbt/1.0/server/6b8ffa8632ff85c4981e/sock
sbt:sample-project>
初回のsbtコマンドで自動的にいくつかのディレクトリとファイルの構造が出来上がりますが、加えてソースファイルの置き場所等を用意する必要があります。詳しくはこちら。
├── build.sbt # プロジェクト名や依存ライブラリなどのビルドの設定をここに書きます
├── project
│ ├── build.properties
│ ├── plugins.sbt # 外部プラグインをここで設定します
│ ├── project
│ └── target
├── src
│ ├── main
│ └── test
└── target
build.sbtがある場所でsbtコマンドを実行すると、build.sbtに記述された設定通りのsbt環境が出来上がります。
lazy val root = (project in file(".")).settings(
name := "sample-project",
version := "0.1",
scalaVersion := "2.13.4", // 使用するScalaのバージョンを書く
// 依存する外部ライブラリ
libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "3.1.1" % Test)
)
sbtコマンドざっくり紹介
sbtコマンド | sbtシェル起動時 | 説明 |
---|---|---|
sbt run |
run |
mainクラスを実行します。 |
- | exit |
sbtシェルを終了します。 |
sbt console |
console |
Scala REPLを立ち上げます。 |
sbt reload |
reload |
ビルド定義を再読み込みします。build.sbtを変更した後に使います。 |
sbt compile |
compile |
全てのソースファイルをコンパイルします。 |
sbt ~compile |
~compile |
ソースファイル監視モードになります(この状態の時は他のsbtコマンドは使えません)。この状態でソースファイルを変更すると、変更ファイルだけにコンパイルがかかります。エンターキーを入力することで監視モードからもとに戻ります。 |
sbt test |
test |
テストを実行します。 |
- | exit |
sbtシェルモードを終了します。 |
sbt ~compile
で動的な差分コンパイルする機能は、次節で導入するMetalsプラグインがあればわざわざ使うことはなくなると思います。
gitignore
sbt環境ではこれを書いておけば大丈夫です。
target/
Metalsの導入
Metalsとは
Java/Scala環境をIDEっぽくしてくれるプラグインです。今回はVSCodeとsbtの組み合わせを紹介しますが、Metalsは複数のテキストエディタと複数のビルドツールに対応しています。
自分はよく知りませんが、内部でBloopというScala用のビルドサーバーが動いているようです。
インストール
VSCodeからMetalsのプラグインをただ追加するだけです。VSCodeのマーケットプレイスで「Scala」と打ったら上から2〜3番目くらいに出てきますので追加してください。依存プラグインはScala Syntax (official)だけです。
すでにScala (sbt)を入れている場合は無効にした方が良いらしいです。自分は途中まで気付かずに有効のままでした。Scala Language Serverというそれっぽいプラグインもありますが今回は入れる必要ないです。
簡単な確認
プラグインが入ったらsbtプロジェクトのルートディレクトリでVSCodeを開くだけで終了なのですが、一応環境を用意してみました。適当なソースファイルを用意したりするのが面倒な方はこちらからクローンしてコード補完などの雰囲気だけでもお試しください。
$ git clone https://github.com/Yoshifumi14/HelloMetals.git
クローンしたら、VSCodeでそのプロジェクトを開きます。(codeコマンドの使用方法)
$ code HelloMetals
すでにsbtプロジェクトがあるので、Metalsがそれを検知していろいろやってくれます。初回は時間かかかりますが、Metalsの読み込みが終わったらそれで完了です。
加えてsbtコマンドも実行できますが、初回は時間がかかるので別にやる必要はないです。
コード整形について
Metalsはコード整形も自動でやってくれます。内部で勝手にScalafmtというScala用のコード整形ツール(提供元はMetalsと同じです)を使用しており、開いているルートディレクトリ直下に.scalafmt.confファイルが勝手に作られるので、さらに設定を追加したい場合はここに書きます。
一応、Scalafmtはsbt単体のプラグインとしても用意されていますが、Metalsも一緒に使用するならばプラグイン設定を記述するplugings.sbtへの記述は不要です。
gitignore
Metals関連はこれを追記します。
.metals/
.bloop/
.ammonite/
metals.sbt
プラグインのGUI
自分はあんまり使ったことがなくて申し訳ないのですが、左側のサイドバーから開けるMetalsのGUI操作でいろいろできそうです。
[New Scala project]でsbtやmeven用のプロジェクトをテンプレートから作成できました。
気をつけること
Metalsが要求するScalaのバージョンがちょっと高いので困る時があります。
私の例では、ちょうど1年前くらいにScala 2.13.1で作った環境があったのですが、今その環境をVSCodeで開くと「2.13.1は将来的にサポートしないかもしれないから2.13.4に更新してくれ」と言われてしまいました。
Scalaのバージョンを更新するには、使用している依存ライブラリが更新後のバージョンでも動くかをよく調査してからでないといけません。なので安易にバージョンを上げることができない点に注意が必要です。
バージョンについては公式ドキュメントで以下のように説明されています(2021年1月時点)
Scala 2.13, 2.12, 2.11 and Scala 3. Metals supports these Scala versions 2.13.4, 2.12.12, 2.12.11, 2.12.10, 2.13.2, 2.13.3, 2.11.12, 2.12.8, 2.12.9, 2.13.0, 2.13.1, 3.0.0-M3, 3.0.0-M2, 3.0.0-M1 and 0.27.0-RC1. Note that 2.11.x support is deprecated and it will be removed in future releases. It's recommended to upgrade to Scala 2.12 or Scala 2.13
終わり
開発環境系の話は試す人によっては思わぬところでハマることがどうしても多いので、うまくいかない可能性も十分あります。なので、せめて必要な具材や調理法の外観だけでも共有できたら幸いです。
また、今回は開発環境についてでしたが、気が向いたら続編ということでビルドやデプロイ周りのことを書いてみようかと思います。sbtやDockerの話が中心となる気がします。
では、ありがとうございました。
参考文献
- Scala公式: https://docs.scala-lang.org
- sbt公式: https://www.scala-sbt.org
- Metals公式: https://scalameta.org/metals
- Bloop公式: https://scalacenter.github.io/bloop
- scalafmt公式: https://scalameta.org/scalafmt
- 実践Scala入門: https://www.amazon.co.jp/dp/4297101416