その昔,Haskellの開発環境を整えようと思った時に,一番手軽だったのはHaskell Platformを導入することでした.

Haskell Platformには次のものが含まれています.

  • Haskellの実装の一つであるGlasgow Haskell Compiler (GHC)
  • ビルドツールでありパッケージマネージャでもあるcabal
  • コアライブラリ一般的なライブラリ

これを導入することで,Haskellの開発をすぐに始めることが出来ました. しかし,Haskell Platformには次のようなストレスもあります.

  • ミラーが無いまたはCDNのエッジが日本国内にないのでダウンロードが遅い
  • リリースがGHCに比べあまり頻繁ではないので,最新の環境が使えない

そのため非常に便利な存在ではありましたが,結局ghcとcabalをbrewで入れてsandboxで個別の環境を整えていたことが多かった気がします. rbenv+gemのように,処理系とライブラリをいい感じに管理できるようなものは無いかと,久しぶりにhaskell.orgのダウンロードページを見ているとstackというものを発見しました. 以下はstackの説明文の引用です.

原文

Stack is a cross-platform build tool for Haskell that handles management of the toolchain (including the GHC compiler and MSYS2 on Windows), building and registering libraries, and more.

訳文

stackはライブラリのビルドと登録,ツールチェーン(GHCコンパイラとWindows上のMSYS2を含む)の管理を行うHaskellのためのクロスプラットフォームのビルドツールです.

いい感じな気がします.

stack haskellといったキーワードで検索してみると,日本語の記事も幾つか見つかりました.

  • Haskellのビルドツール"stack"の紹介
  • Stackを使って楽しくHaskellスクリプティング
  • どちらも国内の著名なHaskellerであり,すごいH本の翻訳者でもある田中さんの投稿です. 早速使ってみようとこのあたりをななめ読みしてみると,以下のことが実現できるようです.

  • ロケーションごとに独立したghcの自動インストール
  • プロジェクトごとに必要なパッケージのインストール
  • プロジェクトのビルド
  • プロジェクトのテスト
  • プロジェクトのベンチマーク

「何が嬉しいのか」は上記の田中さんの記事にまとまっていますが,これがまさに欲しかったものです.

折角なのでこれまでGHC, cabal, Emacsを使っていた開発環境を,stack, Atomで今風に整えてみようと思います.

stackの導入

様々な環境へのインストール手順はstackのドキュメントにまとまっています. 私はOS Xを使っているので,brewでインストールします.

$ brew install haskell-stack

続いて,stack環境をセットアップします. setupサブコマンドの引数にバージョンを指定することで,特定のバージョンのGHCをインストールすることが可能ですが,今回は最新のLTSが欲しいので引数なしで実行します.

$ stack setup

stackで導入したGHCはstack経由で実行する必要があります.

$ stack ghci

Alias設定

毎回長いコマンドを打つのは面倒なので,以下のエイリアスを設定しておきましょう.

alias ghc="stack ghc"
alias ghci="stack ghci"
alias runghc="stack runghc"
alias runhaskell="stack runghc"

PATH設定

また,このあと導入するghc-modやhlintなどのコマンドを利用できるように,stackでインストールしたバイナリが配備されるディレクトリにパスを通しておきます.

export PATH="$HOME/.local/bin:$PATH"

この$HOME/.local/binはfedoraでユーザ用のバイナリインストール先として使われているほか,Pythonのパッケージマネージャであるpipにuserオプションを渡した場合にも使用されています. 後述するstack installインストールしたパケージは,$HOME/.stack配下のディレクトリでビルド・インストールされた後$HOME/.local/binにコピーされます.

ghc-mod, hlintの導入

パッケージ管理システムと処理系のインストールが終わったら,次はエディタを快適に使うための準備をしましょう. どんなエディタを使うにしても型注釈や静的解析があると便利です. Haskellでこれらの機能を使うにはghc-modhlintを導入します. 次に紹介するAtomのパッケージも,上記2つパッケージをバックエンドとして使用します. これらをまとめてインストールするには,以下のコマンドを発行します.

$ stack install ghc-mod hlint

Atomの導入

もはや説明不要なほどに普及しているであろう人気のエディタですが,一応簡単な説明を記載します.

AtomはGitHubが開発したGUIを備えるテキストエディタで,OS X, Linux, Windows上で動作します. ライセンスはMITライセンスです.

Chromiumをベースに開発されており,JavaScriptやCSSなどのWeb技術を利用してカスタマイズが可能な点も魅力の一つでしょう.

私は以前からスクリーンエディタとしてはEmacsを使っており,GUI上のテキストエディタとしては最初TextMateを使用し,その後SublimeTextに乗り換えたのですが,ここ半年ぐらいはAtomをメインに使用しています.

理由は以下のとおりです.

  • Markdownのインテグレーションがデフォルトで入っている
  • 見た目がかっこいい
  • パッケージが十分に豊富
  • パッケージ管理がし易い
  • マルチプラットフォームに対応
  • 拡張を簡単に書けそう

それでは,下記リンクからAtomのバイナリを取得し,インストールを行いましょう.

インストールが完了したら,早速Atomを起動します.

Atomを起動したら,AtomメニューからInstall Shell Commandsを実行して,atomコマンドとapmコマンドを使用可能にしておきましょう.これにより,ターミナルからAtomの起動と,パッケージの管理ができるようになります.

パッケージの導入

apmコマンドが使用できるようになったら,以下のパッケージをインストールします.

  • language-haskell
  • haskell-ghc-mod
  • autocomplete-haskell (この辺は好みなので,Atomのパッケージを眺めながら好みのものを入れるのが良いでしょう)

以下に導入パッケージの簡単な説明を記載します.

language-haskell

AtomにHaskellのサポートを追加します.具体的には,シンタックスハイライトやオートインデントなどが導入されます.

haskell-ghc-mod

ghc-modとhlintをAtomに統合するためのパッケージです. これを導入することで,Atom上で型注釈や静的解析の結果を確認することができるようになります.

autocomplete-haskell

AtomにHaskellのコードの補完機能を追加するパッケージで,上記2つのパッケージに依存しています. これらをまとめてインストールするには,以下のコマンドを発行します.

$ apm install language-haskell haskell-ghc-mod autocomplete-haskell

これでHaskellの開発環境が整いました.

その他

自分で環境構築中に確認したエラーについて記載します.

PATHの問題に起因するもの

  • Failed to run undefined: spawn hlint ENOENT
  • Haskell-ghc-mod: ghc-mod lang failed with error message Error: spawn ghc-mod ENOENT

これらは,Atomがhlintあるいはghc-modを実行しようとした際に,実行ファイルを発見できなかったことに起因します. 考えられる原因としては,

  1. 該当のパッケージがインストールされていない
  2. パッケージのバイナリにPATHが通っていない
  3. AtomにPATHが渡っていない

が考えられます.

1. または2. の場合の確認方法

witchコマンドを実行して,対象のPATHが取得できるか確認します. 実行する際はエラーが報告された対象(hlintかghc-mod)を引数に与えます.

以下はHaskell-ghc-mod: ghc-mod lang failed with error message Error: spawn ghc-mod ENOENTが出た場合の例です.

$ which ghc-mod

実行後にPATHが帰っていれば,インストールおよびPATHの設定は問題ないと考えられますので.の項目を確認してください.

出力が何もない場合,インストールまたはPATHの設定に不備があることが考えられます.

ghc-mod, hlintの導入およびPATH設定を参照して,再度手順を実行してみてください.

3. の場合の確認方法

Atomはコマンドラインシェル(bash, zshなど)から起動した場合,コマンドラインシェルに設定されているPATHが渡りますが,ウィンドウシステムから起動した場合(OS XであればFinderからAtomを起動した場合)は「コマンドラインシェルの環境変数が渡りません」.

つまり,ウィンドウシステムからAtomを起動した場合,Atomはgcc-modとhlintの場所を知らないことになります.

これを解決するためには,

  1. shellからatomコマンドでAtomを起動する
  2. Atomのinit ScriptでprocessのPATH変数を変更する

1.はそのままなので説明は割愛します. 2.はinit Scriptを書くことで,Atom初期化時に任意の処理を実行することができます.

Atomはnode.jsとカスタムされたchromiumをベースに作られているため,ランタイムの環境変数はnodeアプリケーションと同じようにprocess.evnに格納されています.そのため,process.env.PATHを書き換えることで,Atomから参照されるPATHを変更することが出来ます.

Atomメニューから,Open Your init Scriptを選択し,init.coffeeファイルを開きます.

このファイルに,このgistと同じコードスニペットを追加しAtomを再起動することで,ログインシェルに設定された環境変数PATHをAtomに設定することができます.

Free WordPress Themes