Yesod のインストールとチュートリアルやってみた
intro
Haskell 勉強中なんですが、なんか仕様やらばかりやってるのも飽きてきたので、
Web アプリを作ってみようと思い、噂の Yesod を試してみました。
とりあえず、環境作りとチュートリアルまで。
環境づくりはいろいろハマった。。
インストール
とりあえず Haskell Platform から。
Mac なのでインストーラで入れました。
結構サイズが大きいですね。
インストールすると、$HOME/.cabal/bin にパスが通り
Haskell 用パッケージ管理システムである cabal が使えるようになります。
$ cabal update
yesod を入れる方法が quickstart と tutorial で2つ出てきた。
$ cabal install yesod-platform $ cabal install yesod cabal-dev
違いがわからないけど、前者にしておこう。
で、実行するとエラー。
Resolving dependencies... Downloading ansi-terminal-0.5.5... Configuring ansi-terminal-0.5.5... ghc: could not execute: /Developer/usr/bin/gcc
こんな感じのが延々出る。
どうやら /Develper/usr/bin/gcc を探してるみたいだけど、
自分の環境では /usr/bin/gcc なので見つからないのが原因らしい。
(というか、gcc 絶対パスか、、強引だな。。)
symlink でもいいけど、使う gcc 指定できたりしないかなと思い
方法を探したら、やっぱり symlink らしい。
Mac/emacsでHaskell環境を作る - mizchi log
ということで symlink。
上記リンクでは llvm は対応してないって書いてあるけど、
なんとなく試してみたくて、 mac に入ってる llvm-gcc のまま
リンクを通してみたら、なんかうまく行かなかった模様。
結局参照元の通り、 gcc を下記からダウンロード/インストールしました。
kennethreitz/osx-gcc-installer · GitHub
そして、以下のリンクを張ります。
$ sudo mkdir -p /Developer/usr/bin $ sudo ln -s /usr/bin/gcc-4.2 /Developer/usr/bin/gcc
そしたら、cabal で yesod をインストール。
本来は
$ cabal install yesod
で良いはずですが、一回入れて失敗してるので、
念の為に
$ cabal install --reinstall yesod
を実行。とりあえずコンパイルは通った模様。
しかし、 yesod コマンドがない。
というか、
$HOME/.cabal/bin
にパスを通すように書いてあるけど、
実際に yesod のバイナリができているのは、
$HOME/Library/Haskell/bin
だったので、とりあえずそちらを PATH に加えた。
こうして yesod コマンドが使えるようになったら、
$ yesod init
でプロジェクトを作成。
ここでは sample というプロジェクト名にしました。
$ cd sample $ cabal install $ yesod devel
で http://localhost:3000 を確認。
途中色々あったけど、なんとか動いたよう。
表示された画面の下に表示されているようにテストも動かす。
$ yesod test
動いてるみたい。
チュートリアル
チュートリアルに戻って
.gitignore に以下を加えて git init 〜 commit
cabal-dev dist .static-cache static/tmp *.sqlite3
yesod は更新を検知してビルドをやり直してくれるようなので、(hot reloding 的な)
立ち上げっぱなしで次へ。
Some last minute words
大事なファイルは以下
config/routes
url と code のマッピングを定義
Handler/
url にアクセスが有った場合に、呼び出されるコードを保持するファイル
templates/
html, js, css のテンプレート
config/models
永続化するオブジェクトを定義する(database table)
Echo
/echo/[some text]
で
<h1>some text</h1>
を返すサーバを作る。
config/routes に
/echo/#String EchoR GET
を追加。フォーマットは URL handler HTTPMethod
追加してサーバが自動でリビルドを走らせると
Application.hs:31:1: Not in scope: `getEchoR'
というエラーが出る。
getEchoR が無いから。
Handler/Home.hs に実装
getEchoR :: String -> Handler RepHtml getEchoR theText = do defaultLayout $ do [whamlet|<h1>#{theText}|]
コンパイルされて
Starting devel application Devel application launched: http://localhost:3000
(TADA! = 「ジャジャ〜ン」の意味らしい。)
Bulletproof?
URL 型が String 型に変換される時、
参照変換などによって、安全な文字列に変換される。
ここに TypeSafe の強さがあると。
Separate Handlers
EchoR を Echo.hs に分離する。
sample.cabal と Application.hs に記述が必要。
Data.Text
String より Data.Text を使ったほうが良い。
Mirror
GET と POST で作成
Data.Text.reverse を使用
Blog
簡易ブログを作成
GET /blog
記事のリスト表示
POST /blog
記事の作成
GET /blog/
id の記事を表示
スキーマは config/models に
Article title Text content Html deriving
Html が Read, Show, Eq のインスタンスじゃなかったら、
deriving が必要。無いとエラー。らしい。
Handler/Blog.hs を作る。
最初は、モジュールにしたりなどのブロック
entryForm は areq を使ってる。
areq type label default_value
- article.hamlet
- articles.hamlet
以外に
- articleAddError.hamlet
が必要。
その他リソース
紹介されてるもの。
- Try Haskell! An interactive tutorial in your browser: ブラウザで Haskell 実行
- Learn You a Haskell for Great Good!: Web なら無料で読める書籍
- Wadler: Monads: モナドなどのコンセプトを学べるエントリ集
- Real World Haskell: Real World Haskell 読め
おまけ
- HaskellWiki: 公式
- Hoogle: Haskell API Search
- Neil Mitchell - HLint: Haskell の linter
outro
完成品はこちら。
https://github.com/Jxck/yesod-tutorial
お手本はこちら。
https://github.com/yogsototh/yosog
インストール周りで微妙にハマッてしまったけど、
とりあえずひと通り動くところまではできました。
まだ Haskell 自体学び始めなので、 Yesod も書いてて半分はなんだか分からない状態だけど、
とりあえずフレームワーク自体は、よくある Web のフレームワークと近いニュアンスが、
ところどころにあるので、雰囲気くらいはつかめたかと思います。
あと、色々なビルドに時間が結構かかるなぁと。
環境構築自体は最初だけだからいいとして、
yesod のコマンド自体が重いのは、 Rails みたいに
実行を早くするモジュールとかあるのかな?
あとは、まだ SQLite しか試していないけど、 Monog と合わせるとどうなるのかあたりも、
見てみたいと思います。
引き続き、少しづつやっていこうと思います。