Yesod+EclipseFP+Windowsの開発環境構築方法(2014年8月版)

最近僕の机の周りからモナドだのアプリカブルだのの宇宙語が聞こえてくるようになったので、いい加減Haskell勉強しようかと思って開発環境作ろうとしたら異様に面倒だったので、メモとして残します。UNIXシェルの知識があるとスムーズに読めると思います。

# やること
Windows8.1 64bitに、以下の開発環境を構築します。

- eclipse 4.4 64bit
- eclipsefp
- ghc-7.8.3 64bit
- Yesod (yesod-platform 1.2.12.3)
- msys1

リアルタイム文法チェック、自動コード補完、関数定義参照などの機能を手に入れます。

![target.png](https://qiita-image-store.s3.amazonaws.com/0/26528/9fced9ab-6ed0-9571-c615-e18fdbbf696e.png)

Haskell Platformを使うと、なんかいろいろ古いし途中でコケます....。

# 環境のリセット

下記ディレクトリに、ユーザー別の設定ファイルが置いてあります。環境構築途中でコケたりして最初からやり直したい場合は、これらを削除してください。

- %AppData%\cabal
- %AppData%\ghc

# msys(+mingw)のインストール

msysとはWindowsで動作するUNIXシェル環境です。Cygwinのフォークで、UNIX由来のソフトのコンパイル用途に特化している点が違いです。新しいバージョン？のmsys2っていうのもありますが、僕の環境では動かなかったので現行バージョンを使います。下記インストーラーを起動してください。
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download

指示に従って進むと、下記画面が出るので、msys-baseというパッケージを選んで先に進んでインストールを完了してください。

![installer.png](https://qiita-image-store.s3.amazonaws.com/0/26528/0ee7c133-4112-59ce-c55a-8b40262e683f.png)

# GHCの展開
下記URLから、64ビット版のWindows実行ファイルをダウンロードして、適当な場所に展開してください。
http://www.haskell.org/ghc/download_ghc_7_8_3#windows

# パスの設定
パスを通しておかなければならないEclipseFPの依存プログラムがたくさんあるので、そいつをぶっこむディレクトリを用意してきます。僕は`C:\Users\username\App\cabal\bin`に依存プログラムを入れ、その親の`C:\Users\username\App\cabal` 以下に有象無象を入れることしました。以下、それらの場所をベースに書き進めるので便宜読み替えてください。またGHCとmsysにもパスを通さなくてはいけないようです。追加するパスをまとめると下記です。

- C:\Users\username\App\cabal\bin
- %GHCを展開したディレクトリ%\bin
- %GHCを展開したディレクトリ%\mingw\bin
- %MinGWをインストールしたディレクトリ%\msys\1.0\bin

実際には下の画像のような値になります。

![env.png](https://qiita-image-store.s3.amazonaws.com/0/26528/6229764b-f9c2-849a-88fc-360383b6b403.png)

msysへパスを通すのが怖い場合は、eclipseやmsys起動時にパスを設定するスクリプトを個別に書いてください。

# 公式のCabalを入れる
CabalはHaskellの依存ライブラリ管理ツールです。rbenv+rubygemsみたいな感じです。しかし、依存関係の解決がめっちゃシビアなので気をつける必要があります。まずはWindows版のバイナリをダウンロードしてきます。 http://www.haskell.org/cabal/download.html で、展開して出てくる`cabal.exe`を`official-cabal.exe`にリネームしてさっきパスを通した`C:\Users\username\App\cabal\bin`へ入れます。それからコマンドプロンプトで`official-cabal update`コマンドを打ちます。下記のような出力が出ればOKです。

```
C:\Users\username>official-cabal update
Downloading the latest package list from hackage.haskell.org

C:\Users\username>
```

# パッチが当たったCabalを入れる

## ライブラリのインストール

執筆時点ではCabalはUTF-8の処理の不具合があって、一部のライブラリ(tf-randomとか)のインストールに失敗するので、パッチの当たったCabalを入れなおします。未来にリリース予定のcabal-install 1.20.0.4および1.21では修正されています。

まずは、パッチ適用済みのcabalのソース (https://github.com/haskell/cabal/archive/aa0a6979f3223387aae830cf1d21b2c21978d767.zip
 )をダウンロードして `C:\Users\username\App\cabal\utf8cabal` へ展開します。

次に、 msysのシェル(%MinGWをインストールしたディレクトリ%\msys\1.0\msys.bat)を起動して、下記のコマンドを叩いてください。

```bash
cd /c/Users/username/App/cabal/utf8cabal/Cabal
official-cabal install
```
このコマンドは、Cabalライブラリを`%AppData%\cabal`へインストールします。(buildwrapper.exeが、sandboxでビルドしても実行時になぜか共通領域のライブラリを参照するため。本当は良くない気がするのですが、これ以外の良い方法が思いつかない)

## sandbox利用の強制

次に、 `%AppData%\cabal\config`ファイルを編集して、
```-- require-sandbox: True
```
となっている行を
```require-sandbox: True
```
としてください。既にcabalに慣れている場合はやんなくても良いかも。

## cabal.exeのインストール 

msysのシェルで下記のコマンドを叩いてください。sedコマンドで、インストール先を指定しているため、その個所は便宜書き換えてください。

```bash
cd /c/Users/username/App/cabal/utf8cabal/cabal-install
official-cabal sandbox init
sed -i "s%^  bindir: .*%  bindir: c:/Users/username/App/cabal/bin%" cabal.sandbox.config
official-cabal install
```

`C:\Users\username\App\cabal\bin` に `cabal.exe`が入っていたら成功です。

# 依存実行ファイルのインストール

下記コマンドをmsysのシェルに貼りつけて依存実行ファイルをぶっこみます。最初の行にディレクトリ指定があるので、書き換えてください。

```bash:inst.sh
dir=c:/Users/username/App/cabal
for app in alex happy hoogle hlint \
           sourcegraph stylish-haskell uuagc \
           scion-browser buildwrapper yesod-bin; do 
  mkdir $dir/$app
  cd $dir/$app
  cabal sandbox init
  sed -i "s%^  bindir: .*%  bindir: $dir/bin%" cabal.sandbox.config
  cabal install $app
done
```

指定されたディレクトリにコマンドが大量に入っていたら成功です。コマンド別にsandboxを作っていますが、そうしないと現時点では依存関係がどうたらと言われて途中で止まります。

# EclipseFPのインストール

- まず、eclipseを入れます。via https://www.eclipse.org/downloads/
- 次に、メニューから Help → Install New Software → Work With: → All Available Sites → Web, XML, Java EE ..... → Eclipse Web Developer Tools をチェック → Nextから指示に従ってインストール、再起動
- 次に、メニューから Help → Eclipse Marketplace → Search → Find: → eclipsefp と入力 → Go → EclipseFPが出るのでインストール、再起動
- 次に、メニューから Windows → Preferences → Haskell から、さっき入れたghcやcabalやその他のソフトの位置を設定。また、cabalを設定したら、Haskell → Sandboxing → Use cabal sandboxesにチェックすると全体設定を書き換えることが減るためより良いと思います。

# プロジェクトを作って開発開始

メニューの File → New → Project → Haskell → Yesod Project を選ぶとテンプレート的なプロジェクトができる。プロジェクト用のcabalライブラリの自動インストールが走るので、ちょっと待つ。コンソールウィンドウを開くと、下図のように進捗がわかる

![build.png](https://qiita-image-store.s3.amazonaws.com/0/26528/4f475f00-976c-e046-fa72-6e1b5d7510e4.png)

終わったら、開発だっ！

![devel.png](https://qiita-image-store.s3.amazonaws.com/0/26528/e6237385-f81c-39cb-f6f1-27351d540ec1.png)

ヒャッハー、コード補完 + リアルタイム文法チェックだー！ EmacsやVimでもできるという噂は聞きますが、Windowsでやるのは難しいように思う。

# TODO

- パスの設定がシビアになっているのを修正したい
- Cabalライブラリをユーザー別共通領域に入れるのは良くない気がする
- cabal.sandbox.configを直接編集するのは良くない