1. IDE 統合

IDE 統合 

エディターと sbt だけで Scala をコーディングすることも可能ですが、今日のほとんどのプログラマーは、統合開発環境(略して IDE)を使用しています。Scala で人気のある IDE は、MetalsIntelliJ IDEA の 2 つであり、どちらも sbt ビルドと統合されています。

Metals ビルドサーバーとして sbt を使用する 

Metals は、Scala 用のオープンソースの言語サーバーであり、VS CodeLSP をサポートする他のエディターのバックエンドとして機能できます。Metals は、ビルドサーバープロトコル(BSP)を介して sbt を含むさまざまなビルドサーバーをサポートします。

VS Code で Metals を使用するには

  1. 拡張機能タブから Metals をインストールします
    Metals
  2. build.sbt ファイルを含むディレクトリを開きます。
  3. メニューバーから、「表示」>「コマンドパレット…」(macOS では Cmd-Shift-P)を実行し、「Metals:ビルドサーバーの切り替え」を選択し、「sbt」を選択します。
    Metals
  4. インポートプロセスが完了したら、Scala ファイルを開いて、コード補完が機能することを確認します
    Metals

次の設定を使用して、BSP から一部のサブプロジェクトをオプトアウトします。

bspEnabled := false

コードを変更して保存する(macOS では Cmd-S)と、Metals は sbt を呼び出して実際のビルド作業を実行します。

VS Code でのインタラクティブデバッグ 

  1. Metals は、コードにブレークポイントを設定することでインタラクティブデバッグをサポートします
    Metals
  2. インタラクティブデバッグは、単体テストを右クリックし、「テストのデバッグ」を選択することで開始できます。テストがブレークポイントに到達すると、変数の値を検査できます
    Metals

インタラクティブデバッグセッションをナビゲートする方法の詳細については、VS Code ドキュメントのデバッグページを参照してください。

sbt セッションへのログイン 

Metals は sbt をビルドサーバーとして使用していますが、シンクライアントを使用して同じ sbt セッションにログインすることもできます。

  • ターミナルセクションで、sbt --client と入力します
    Metals

これにより、Metals が開始した sbt セッションにログインできます。そこでは、すでにコンパイルされたコードで testOnly やその他のタスクを呼び出すことができます。

IntelliJ IDEA へのインポート 

IntelliJ IDEA は JetBrains によって作成された IDE であり、Community Edition は Apache v2 ライセンスに基づいてオープンソースです。IntelliJ は、プロジェクトをインポートするために sbt を含む多くのビルドツールと統合されています。これは、BSP アプローチよりも信頼性が高い可能性がある、より従来のアプローチです。

ビルドを IntelliJ IDEA にインポートするには

  1. プラグインタブに Scala プラグインをインストールします
    IntelliJ
  2. プロジェクトから、build.sbt ファイルを含むディレクトリを開きます。
    IntelliJ
  3. インポートプロセスが完了したら、Scala ファイルを開いて、コード補完が機能することを確認します。

IntelliJ Scala プラグインは、独自に軽量のコンパイルエンジンを使用してエラーを検出しますが、高速ですが、不正確な場合があります。コンパイラベースの強調表示によると、IntelliJ はエラー強調表示に Scala コンパイラを使用するように構成できます。

IntelliJ IDEA でのインタラクティブデバッグ 

  1. IntelliJ は、コードにブレークポイントを設定することでインタラクティブデバッグをサポートします
    IntelliJ
  2. インタラクティブデバッグは、単体テストを右クリックし、「「<テスト名>」をデバッグ」を選択することで開始できます。あるいは、単体テストの近くのエディターの左側にある緑色の「実行」アイコンをクリックすることもできます。テストがブレークポイントに到達すると、変数の値を検査できます
    IntelliJ

インタラクティブデバッグセッションをナビゲートする方法の詳細については、IntelliJ ドキュメントのコードのデバッグページを参照してください。

IntelliJ IDEA ビルドサーバーとして sbt を使用する (高度) 

ビルドを IntelliJ にインポートするということは、コードを作成している間、IntelliJ をビルドツールおよびコンパイラとして効果的に使用していることを意味します(コンパイラベースの強調表示も参照してください)。多くのユーザーはこのエクスペリエンスに満足していますが、コードベースによっては、コンパイルエラーの一部が誤っている可能性があり、ソースを生成するプラグインではうまく機能しない可能性があり、一般的に sbt と同じビルドセマンティクスでコードを作成したい場合があります。ありがたいことに、最新の IntelliJ は、ビルドサーバープロトコル(BSP)を介して sbt を含む代替のビルドサーバーをサポートしています。

IntelliJ で BSP を使用する利点は、実際のビルド作業に sbt を使用することです。そのため、sbt セッションをサイドで起動していたプログラマーであれば、二重コンパイルを回避できます。

IntelliJ にインポート IntelliJ での BSP
信頼性 ✅ 信頼性の高い動作 ⚠️ まだ成熟していません。UX の問題が発生する可能性があります。
応答性 ⚠️
正確性 ⚠️ 型チェックには独自のコンパイラを使用しますが、scalac を使用するように構成できます ✅ 型チェックには Zinc + Scala コンパイラを使用します
生成されたソース ❌ 生成されたソースは再同期が必要です
ビルドの再利用 ❌ sbt を並行して使用するには二重ビルドが必要です

IntelliJ で sbt をビルドサーバーとして使用するには

  1. プラグインタブに Scala プラグインをインストールします。
  2. BSP アプローチを使用するには、プロジェクトタブの「開く」ボタンを使用しないでください
    IntelliJ
  3. メニューバーから、「新規」>「既存のソースからプロジェクト」をクリックするか、「アクションを検索」(macOS では Cmd-Shift-P)を入力して、「既存のソースからプロジェクトをインポート」を見つけます
    IntelliJ
  4. build.sbt ファイルを開きます。プロンプトが表示されたら、BSP を選択します
    IntelliJ
  5. BSP ワークスペースをインポートするツールとして、sbt (推奨) を選択します
    IntelliJ
  6. インポートプロセスが完了したら、Scala ファイルを開いて、コード補完が機能することを確認します
    IntelliJ

次の設定を使用して、BSP から一部のサブプロジェクトをオプトアウトします。

bspEnabled := false
  • 設定を開き、「BSP」を検索し、「ファイル保存時に自動的にビルド」をオンにし、「インポート前に sbt プロジェクトを Bloop にエクスポート」をオフにします
    IntelliJ

コードを変更して保存する(macOS では Cmd-S)と、IntelliJ は sbt を呼び出して実際のビルド作業を実行します。

詳細については、Igal Tabachnik の IntelliJ および Scala での BSP の効果的な使用も参照してください。

sbt セッションへのログイン 

シンクライアントを使用して、既存の sbt セッションにログインすることもできます。

  • ターミナルセクションで、sbt --client と入力します IntelliJ

これにより、IntelliJ が開始した sbt セッションにログインできます。そこでは、すでにコンパイルされたコードで testOnly やその他のタスクを呼び出すことができます。

MetalsのフロントエンドとしてNeovimを使用する(上級者向け) 

Neovimは、LSPを標準でサポートするVimのモダンなフォークであり、Metalsのフロントエンドとして設定できます。

MetalsのメンテナーであるChris Kipp氏は、Neovimで包括的なMetalsサポートを提供するnvim-metalsプラグインを作成しました。nvim-metalsをインストールするには、Chris氏のlsp.luaを参考に、$XDG_CONFIG_HOME/nvim/lua/の下にlsp.luaを作成し、好みに合わせて調整してください。たとえば、プラグインセクションをコメントアウトし、vim-plugなどの選択したプラグインマネージャーを使用して、リストされたプラグインをロードしてください。

init.vimでは、以下のようにファイルをロードできます。

lua << END
require('lsp')
END

lsp.luaに従って、g:metals_statusがステータスラインに表示されるはずです。これはlualine.nvimなどを使用して実現できます。

  1. 次に、Neovimを使用してsbtビルド内のScalaファイルを開きます。
  2. プロンプトが表示されたら、:MetalsInstallを実行します。
  3. :MetalsStartServerを実行します。
  4. ステータスラインが設定されている場合、「sbtに接続中」または「インデックス作成中」のようなものが表示されるはずです。
  5. コード補完はインサートモードで動作し、候補をタブで移動できます。
  • 変更を保存するとビルドがトリガーされ、コンパイルエラーがインラインで表示されます。

定義へジャンプ 

  1. カーソル下のシンボルの定義にジャンプするには、gDを使用します(正確なキーバインドはカスタマイズ可能です)。
  2. 古いバッファに戻るには、Ctrl-Oを使用します。

ホバー 

  • カーソル下のシンボルの型情報(ホバーのように)を表示するには、ノーマルモードでKを使用します。

診断のリスト表示 

  1. すべてのコンパイルエラーと警告をリスト表示するには、<leader>aaを使用します。
  2. これは標準のquickfixリストにあるため、:cnext:cprevなどのコマンドを使用して、エラーや警告をナビゲートできます。
  3. エラーのみをリスト表示するには、<leader>aeを使用します。

Neovimを使用したインタラクティブデバッグ 

  1. nvim-dapのおかげで、Neovimはインタラクティブデバッグをサポートしています。<leader>dtを使用してコードにブレークポイントを設定します。
  2. ユニットテストに移動し、ホバー(K)でビルドされていることを確認し、次に「デバッグ続行」(<leader>dc)してデバッガーを開始します。プロンプトが表示されたら「1: RunOrTest」を選択します。
  3. テストがブレークポイントに達したら、デバッグホバー(<leader>dK)で変数の値を調べることができます。
  4. セッションを終了するには、再度「デバッグ続行」(<leader>dc)を実行します。

詳細については、nvim-metalsを参照してください。

sbt セッションへのログイン 

シンクライアントを使用して、既存の sbt セッションにログインすることもできます。

  1. 新しいvimウィンドウで:terminalと入力して、組み込みターミナルを起動します。
  2. sbt --clientと入力します。

Neovim内であっても、タブ補完などは問題なく動作します。