Docker 環境での VSCode と haskell-ide-engine の使い方について

概要

少し前にもDockerについて書いたりしましたがまだ本格的に使うところまでいってなくて勉強中です。

Dockerを開発環境に使う場合にエディタなどはどうするかというところを調べてみました。

一応 Docker 開発環境でも VSCodehaskell-ide-engine を使うことができそうなことがわかったためまとめてみます。

VSCode

Visual Studio Code - Visual Studio

VSCodeWindowsだけでなくLinux環境などでも簡単に入れられるようで 色々な言語のプラグインも公開されていて便利そうでした。 vimプラグインもあってvim設定もある程度反映してくれるので移行しやすそうな雰囲気でした。

Official page for Language Server Protocol

Language Server Protocol という言語のプラグインのための仕様が決められているようです。 Language Server Protocol は VSCode だけでなく他のエディタでも使われるようになってきているみたいです。

haskell-ide-engine

GitHub - haskell/haskell-ide-engine: The engine for haskell ide-integration. Not an IDE

Language Server Protocol の Haskell 版の実装として haskell-ide-engine が開発されているようです。 VSCode の他にも neovim や atom などでも使えるみたいです。

Haskell Language Server - Visual Studio Marketplace

VSCode から使う場合は Haskell Language Server というプラグインを入れて使います。

やり方

haskell-ide-engine は hie というコマンドでインストールされます。 VSCode からもこの hie コマンドが実行されることになります。 hie の実行自体はホスト環境からでも docker rundocker exec を使えば可能なので ディレクトリの共有などを上手く解決できればおそらく使うことができると思います。

下のようなやり方でやってみました。

開発環境用の Docker イメージに haskell-ide-engine を入れる

haskell-ide-engine は hackage や stackage にはまだ登録されて無くて github から取得してビルドする必要があるようです。 github にビルド方法が書かれているので同様の内容で Dockerfile に書いてビルドするようにしました。

またホスト環境と Docker 環境でユーザーが違うため stack のグローバル設定に

allow-different-user: true

を追加しました。

VSCodeプラグインを入れる

Running Visual Studio Code on Linux

Ubuntu環境では公式のドキュメントの通りに入れられました。

プロジェクトのディレクトリをボリュームにマウントして Docker コンテナを起動

プロジェクトのディレクトリをマウントして VSCode と Docker 環境の両方から使えるようにします。 プロジェクトのディレクトリに移動して下のようなコマンドでDockerコンテナを起動します。

docker run -id --rm -v $(pwd):$(pwd) --name containername imagename

起動したDockerコンテナのhaskell-ide-engineを実行するスクリプトを作成

VSCodeプラグインから Dockerコンテナ内の hie を実行するスクリプトを作成します。 下のようなスクリプトを書きました。

#!/bin/bash
docker exec -i containername hie --lsp

スクリプト内にコンテナ名を直接書いていて特定のプロジェクトでしか使えないのが微妙ですがあまりよい方法が思いつきませんでした。

このスクリプトVSCodeから実行できるようにパスが通っている場所に置きました。

VSCodeワークスペース設定を作成

Visual Studio Code User and Workspace Settings

VSCodeではワークスペース設定でプロジェクト固有の設定を使うことができるようです。

hie のコマンドを直接呼び出す代わりに先に作成したスクリプトを呼び出すため下のような設定にしました。

{
    "folders": [
        {
            "path": "app"
        },
        {
            "path": "src"
        },
        {
            "path": "tests"
        }
    ],
    "settings": {
        "languageServerHaskell.useCustomHieWrapper": true,
        "languageServerHaskell.useCustomHieWrapperPath": "hie-docker.sh"
    }
}

まとめ

Docker 開発環境での VSCodehaskell-ide-engine の使い方について調べてみました。 色々な準備が必要ですが一応は使うことは可能だと思います。 ただ実際に使って開発しているわけではないので使ってみると問題が出てくるかもしれません。 ビルドに結構時間がかかるので haskell-ide-engine まで入ったイメージが配布されると便利かなと思います。