はじめに
この記事では、以下二点を目標に話を進める。
- Windows 上に最低限の Haskell 開発環境を構築する
- Atom で ghc-mod による入力補完が使えるようにする
以下の点は扱わない。
- cabal ファイルの書き方
- stack の使い方
stack 導入
Haskell 環境構築のため、まずは stack を導入する。
stack は最近登場した Haskell のパッケージ管理/ビルドツール1で、色々便利なので入れておく。
- 以下のリンクから最新のバイナリを入手
- 入手したバイナリを stack.exe にリネームして、パスの通ったところに配置
GHC とライブラリの導入
導入は stack が自動でやってくれる。
- 以下コマンドを実行
stack setup
- 完了すると以下のようなメッセージが表示される。環境変数への追加は行わなくてもよい
Would add the following to PATH:
C:\Users\<username>\AppData\Local\Programs\stack\x86_64-windows\ghc-7.8.4\bin;C:\Users\<username>\AppData\Local\Programs\stack\x86_64-windows\ghc-7.8.4\mingw\bin;C:\Users\<username>\AppData\Local\Programs\stack\x86_64-windows\git-2.4.5.1\cmd;C:\Users\<username>\AppData\Local\Programs\stack\x86_64-windows\git-2.4.5.1\usr\bin
プロジェクト作成
stack を使ってプロジェクトを作成する。
REM 作業ディレクトリに移動
cd workspace\sample
REM プロジェクトの作成
stack new
REM ビルド
stack build
REM 実行
stack exec new-template-exe
ghc-mod 導入
Haskell の高度な補完のため、 ghc-mod を導入する。
stack install cabal-install ghc-mod
ghc-mod のラッパー作成
ghc-mod などのツールは stack exec コマンド経由でのみ実行可能であり、このままでは Atom から認識できない。Atom から認識させるため、Haskell プラグイン自体を修正してもよいが、今回はラッパースクリプトを用意して対応する。
- 以下のスクリプトをパスの通ったところに配置する。
ghc-mod.bat
@stack exec -- ghc-mod %*
ghc-mod-configure.bat
@FOR /F "usebackq" %%t IN (`stack path --snapshot-pkg-db`) DO @SET SNAPSHOT_DB=%%t
@FOR /F "usebackq" %%t IN (`stack path --local-pkg-db`) DO @SET LOCAL_DB=%%t
@FOR /F "usebackq" %%t IN (`stack path --bin-path`) DO @SET BIN_PATH=%%t
@SET PATH=%PATH%;%BIN_PATH::C:\=;C:\%
@cabal configure --package-db=clear --package-db=global --package-db=%SNAPSHOT_DB% --package-db=%LOCAL_DB%
- プロジェクトの状態を更新する
- cabal ファイル更新のたびに再実行が必要
REM 作業ディレクトリに移動
cd workspace\sample
REM 更新
ghc-mod-configure
Atom
以下のパッケージをインストールする
- language-haskell
- autocomplete-haskell
- haskell-ghc-mod
スクリーンショット
課題
- cabal ファイル変更時に stack build, ghc-mod-configure の再実行が必要
- 忘れると Atom 上に大量のエラーが……
- 自動化できそうだけど Windows のバッチファイル書きたくない
参考/関連
- Haskell開発環境の構築 (Linux編) - Qiita
- Atomのhaskell-ghc-modをstack使用時にも動くようにする - Qiita
- Haskellの単体テスト最前線 - あどけない話
-
Rubyist 向けにいうと、 stack ≒ rbenv + ruby-install + bundler + rake ↩