Docker 環境での VSCode と haskell-ide-engine の使い方について
概要
少し前にもDockerについて書いたりしましたがまだ本格的に使うところまでいってなくて勉強中です。
Dockerを開発環境に使う場合にエディタなどはどうするかというところを調べてみました。
一応 Docker 開発環境でも VSCode と haskell-ide-engine を使うことができそうなことがわかったためまとめてみます。
VSCode
Visual Studio Code - Visual Studio
VSCodeはWindowsだけでなく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 run
や docker exec
を使えば可能なので
ディレクトリの共有などを上手く解決できればおそらく使うことができると思います。
下のようなやり方でやってみました。
- 開発環境用のDockerイメージに haskell-ide-engine を入れる
- VSCode と Haskell Language Server プラグインをホスト環境に入れる
- プロジェクトのディレクトリをボリュームにマウントして Docker コンテナを起動
- 起動した Docker コンテナの haskell-ide-engine を実行するスクリプトを作成
- VSCode のワークスペース設定を作成
開発環境用の 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 開発環境での VSCode と haskell-ide-engine の使い方について調べてみました。 色々な準備が必要ですが一応は使うことは可能だと思います。 ただ実際に使って開発しているわけではないので使ってみると問題が出てくるかもしれません。 ビルドに結構時間がかかるので haskell-ide-engine まで入ったイメージが配布されると便利かなと思います。