75
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

YesodAdvent Calendar 2014

Day 2

【Mac OS X 10.10】Haskell + Yesod + Heroku で webアプリ 1/3

Last updated at Posted at 2014-12-02

14/12/02 現在最新の情報です.

そろそろHaskellでwebアプリの一本でも作りたくなる季節ですよね.

Screenshot 2014-12-01 18.40.02.png

(画像はYesodでwebアプリのひな形を作った時に出てくる謎のアスキアート、Haskell界隈にはこいう不可解なものが多くてステキ)

Haskell + Yesod + Heroku でwebアプリを作る事を「HYH」と言うらしいですよ(適当)

今回は環境構築編です. 次はアプリケーション構築法、最後にデプロイ法を書きます.

GHC

GHC ... Haskellのコンパイラで一番有名でYesodが唯一サポートしている. 今なら(いつでも)もれなくインタプリタをついてくる

hsenv などもあるにはありますが、作者がさぼっていますしおすすめは出来ません.

後述するStackage + cabal sandbox + cabal freeze がベストプラクティスだと思います.

Yesodの公式ブログでもyesod-platformを非推奨にして上記の方法をおすすめしています。

てことでghcはHomebrewで入れる.(14/12/02現在 最新版7.8.3になっている事を確認)

$ brew install ghc

これでコンパイラー(ghc)とインタプリタ(ghci) ゲット.

cabal

cabal ... Haskellのビルドツール. RubyのBundler, Node.jsのnpm 的なアレ

以前まではHaskell-Platformで入れていたと思うのですけど、

最近は依存解消にcabal sandboxを使うのが主流ぽいのでcabal だけ入れるのがよいかと.

(依存は避ける限り避けるのがHaskell道. でなければすぐ依存の闇に捕まります.)

バイナリを配っているので持ってきて解凍. /tmp に移動してるのはゴミファイルを残すのが嫌なだけなので必須ではない.

(14/12/02現在最新版. cabal 1.20.0.1)

$ cd /tmp
$ wget https://www.haskell.org/cabal/release/cabal-install-1.20.0.3/cabal-1.20.0.3-x86_64-apple-darwin-mavericks.tar.gz

wget が無い人はbrew install wget とかまあよしなに.

解凍する.

$ tar jxf cabal-1.20.0.3-x86_64-apple-darwin-mavericks.tar.gz

解凍したやつのbuild/cabal/ にバイナリがいる.

$ cd ./dist/build/cabal
$ ./cabal update
$ ./cabal install cabal-install

(結構長い. 僕の場合5分くらい)

パスを通す

~/.cabal/bin にパスを通す必要があります. ご自身のシェルにあわせてよしなに

$ echo 'export PATH=$HOME/.cabal/bin:$PATH' >> ~/.zshrc
$ which cabal
  ~/.cabal/bin/cabal

これでcabalコマンドが使えるようになりました!

hackage(Haskellパッケージの中央管理サイト)からよしなに取ってこれます.

Stackage + sandbox + freeze

Haskellの世界では未だに依存地獄が至る所に潜んでいて試行錯誤が続けられている.

Stackage...統合ビルドのテストを通ったバージョンが指定されたパッケージのリストをくれる.

sandbox...プロジェクト単位にパッケージを独立して管理出来るcabalの機能.

freeze...依存先の依存先は知り得なくバージョンが範囲指定のままだとヤバいのでバージョンを固めるcabalの機能

この3つを駆使して依存と戦うのが現代的なHaskell道.

Stackage

ともあれcabal update をキメる.

$ cabal update

~/.cabal/config を開いてremote-repo: hackag(ry となっている行を

remote-repo: stackage-2014-11-26-ghc78hp-exc:http://www.stackage.org/snapshot/2014-11-26-ghc78hp-exc

↑こいつに変えましょう(14/12/02現在最新). 再度 cabal update をキメる.

$ cabal update

これでcabal install で取ってくる先が Stackage という依存解消がなされたリストになりました.

Yesod

Github

割とフルスタックなHaskell製のwebフレームワーク. もっとコンパクトなScotty(Sinatraぽい)のとか結構色々ある.

yesodとalexとhappyを入れる. alexとhappyはHaskellのレクサーとパーサーで一番有名なやつ.

$ cabal install yesod-bin alex happy

(かなり長い. お茶でも入れた方が良さそう)

(10分くらい経過)

yesod init をキメる.

$  yesod init

対話形式で質問に答える.DBはローカルならSqliteでおk

  • プロジェクト名はキャメルケース(e.g. TestApp)

Screenshot 2014-12-01 18.40.02.png

ひな形が出来たぽい.

$  cd [プロジェクト名(対話形式のところで答えたもの)]

パッケージをインストール

$  cabal install -j --enable-tests --max-backjumps=-1 --reorder-goals

$  yesod devel

約束の地、http://localhost:3000/へ

ようやく辿りつきました. http://localhost:3000/

Screenshot 2014-12-01 19.47.54.png

fooo↑↑

依存関係でエラーが出たら

エラーメッセージでググってどうしようも無かった時に使える呪文を書いておきます.

rm -rf ~/.ghc; rm -rf ~/.cabal; brew uninstall ghc

つまり最初からやり直すのがいいです. (Haskellの依存の闇はやばい)

75
77
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
75
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?