2013年12月21日土曜日

[haskell][yesod] Yesodのインストールとチュートリアルの実行手順のまとめ

HaskellのウェブアプリケーションフレームワークであるYesodに触れてみました。Yesodのチュートリアルを参考にして、自分のmac上にYesodをインストールし、サンプルサーバーをデプロイしたときの手順と、あとで調べたいと思った疑問点のメモを残しておきます。haskell platformがインストールされている環境を前提にしています。

Yesodのセットアップ手順:

  1. cabalでyesod関連のパッケージをインストール
    • コマンドラインから以下のコマンドを実行。20分くらい?かかります。
      • cabal install yesod-platform yesod-bin cabal-dev
  2. プロジェクトの生成
    • 以下のコマンドを実行
      • yesod init
        • プロジェクト名に"Yosog"を入力
        • DBは's' (sqlite) を選択
        
        % yesod init
        Welcome to the Yesod scaffolder.
        I'm going to be creating a skeleton Yesod project for you.
        
        What do you want to call your project? We'll use this for the cabal name.
        
        Project name: Yosog
        Yesod uses Persistent for its (you guessed it) persistence layer.
        This tool will build in either SQLite or PostgreSQL or MongoDB support for you.
        We recommend starting with SQLite: it has no dependencies.
        
            s      = sqlite
            p      = postgresql
            pf     = postgresql + Fay (experimental)
            mongo  = mongodb
            mysql  = MySQL
            simple = no database, no auth
            url    = Let me specify URL containing a site (advanced)
        
        So, what'll it be? s
        That's it! I'm creating your files now...
        
        ---------------------------------------
        
                             ___
                                    {-)   |\
                               [m,].-"-.   /
              [][__][__]         \(/\__/\)/
              [__][__][__][__]~~~~  |  |
              [][__][__][__][__][] /   |
              [__][__][__][__][__]| /| |
              [][__][__][__][__][]| || |  ~~~~
          ejm [__][__][__][__][__]__,__,  \__/
        
        
        ---------------------------------------
        
        The foundation for your web application has been built.
        
        
        There are a lot of resources to help you use Yesod.
        Start with the book: http://www.yesodweb.com/book
        Take part in the community: http://yesodweb.com/page/community
        
        
        Start your project:
        
           cd Yosog && cabal install && yesod devel
        
        or if you use cabal-dev:
        
           cd Yosog && cabal-dev install && yesod --dev devel
        
        
        
      • 生成されたYesogディレクトリに移動
        • cd Yosog
    • サーバーのテンプレートをセットアップ、ビルドして起動?こちらは30分以上かかりました。
      • cabal-dev install
      • yesod --dev devel
  3. サーバーへの接続確認
    • ブラウザで以下のURLにアクセス
      • http://localhost:3000/

これでサンプルサーバーが起動され、ブラウザからのアクセスに対して上記のようなレスポンスを返してくれる状態になりました。さらに、自前のハンドラを登録してエコーバックするweb serviceを動作させるには以下の作業を行います。

エコーバックハンドラの登録:

  1. ハンドラの追加
    • 以下のコマンドで空のハンドラが生成されます。
      • yesod add-handler
      
      % yesod add-handler
      Name of route (without trailing R): Echo
      Enter route pattern (ex: /entry/#EntryId): /echo/#String
      Enter space-separated list of methods (ex: GET POST): GET
      
      
      • Name of routeに"Echo"を指定
      • route patternに"/echo/#String"を指定
      • list of methodsに"GET"を指定
  2. echoハンドラの実装
    • add-handlerで生成されたHandler/Echo.hsを以下のように編集
      
      
      module Handler.Echo where
      
      import Import
      
      getEchoR :: String -> Handler Html
      getEchoR theText = defaultLayout [whamlet|<h1>#{theText}|]
      
      
  3. サーバーを起動
    • 以下のコマンドを実行する。このコマンドでビルドもされます。
      • yesod --dev devel
  4. ブラウザからechoサーバーのuriをたたく。
    • 以下のURLを指定してブラウザを開きます。
      • http://localhost:3000/echo/Hello%20Echo%20Server

これで上記のような画面が表示されます。

チュートリアルを一通りなぞった後の感想

最新のサーバーフレームワーク事情に精通している訳ではないのですが、ちょっと触った感覚としてはYesodが想像以上に多機能で本格的なフレームワークであることがわかりました。rubyのWEBrick的なプリミティブなものをイメージしていたのですが比較になりません。ざっとみただけでも以下のような機能、仕組みが用意されており「恐れ入りました」という感じです。
  • ビルド→サーバー起動がyesodコマンド一発
    • サーバー起動中もコードの変更を検知して自動的にビルド&デプロイ
  • ログ出力
  • Handlerの登録がadd-handler一発
    • 空のハンドラコード
    • ハンドラの登録
  • 各種DB対応
    • SQLite, PostgreSQL, MySQL, MongoDB
    • config/modelsにORマップ定義ができる
  • 認証・認可の仕組みも備わっている模様
    • OAuthのためのライブラリも存在
  • viewをtemplate(.hamlet)として分離できる
    • hamletの中でhaskellコードを書くことも可能
    • ループを書ける!
    • コードから参照しているhamletが存在しないと、ビルド時にエラー!
  • 自動生成されるhtmlをみていると各種ブラウザの振る舞いの違いも吸収してくれそう?
最後に(haskell超初心者の)自分にとって、よく理解できなかった手順の意味、チュートリアルの説明と調査結果をまとめておきます。
  • cabal-devってなんのためのパッケージ?
    • どうもcabalの代わりにcabal-devを利用することで、cabalでインストール済みのパッケージ群から独立して、個別のパッケージ群をインストールすることができるようです。これにより特定の環境で利用するパッケージのバージョンを固定し、cabalによるパッケージ更新の影響を受けなくできます(ここここのブログエントリ参考にしました)。
  • cabal-dev installは具体的には何をやっているの?
    • 前述の通りcabal-devを用いると既存のパッケージを参照しないように、必要なパッケージを全て0からダウンロード&インストールすることになります。これによりyesodでは30分という時間がかかるようです。
  • チュートリアル中に"It is a good practice to use Data.Text instead of String."とあったが、その心は?
    • hackageのData.Textのページを見ると、「時間的・空間的に効率の良いユニコードテキストの実装」「正規化、正規表現、非標準的なエンコーディング、ロケール等の便利な機能がそろっている」ということらしい。

github上のリポジトリでチュートリアルで利用されたコード類が公開されているようです。
終わり。