5

wai を使用した基本的な「hello world」アプリケーションのセットアップがあり、wai-handler-devel を使用したいと考えていますが、方法が不明で、wai プロジェクトでの使用例が見つかりません。

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 () -- Just for an orphan instance

app :: Application
app _ = return $ responseLBS
    status200
    [("Content-Type", "text/plain")]
    "Hello, World!"

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    run 8080 app

基本的な wai アプリで wai-handler-devel を動作させるにはどうすればよいですか?

注: 「wai-handler-devel: コマンドが見つかりません」という問題が発生した場合は、ここ ( https://gist.github.com/1499226 ) に修正があります。

4

1 に答える 1

5

wai-handler-devel のHackage ページには、次のようにコマンドラインから呼び出す必要があると書かれています。

$ wai-handler-devel <port> My.App.Module myApp

また、アプリケーションの型は次のようになっている必要があります。

myApp :: (Application -> IO ()) -> IO ()

この場合、myApp次のように定義する必要があります。

myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler app

appただし、完全にインライン化することもできます:

myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler $ \_ -> return $ responseLBS
    status200
    [("Content-Type", "text/plain")]
    "Hello, World!"

で起動時の初期化などを行えるように、型はこのような形になっていますIO。wai-handler-devel の git リポジトリからSmallAppFullAppの例を読むことをお勧めします。後者は、リロード中のコードの流れを示すデバッグ出力があり、実行時間の長いデータベース接続を統合する方法を示しているため、特に役立ちます。

FullApp の例の実行スクリプトは、プログラムで wai-handler-devel を使用する方法も示しています。これには、Hamlet テンプレートの依存関係 (wai-handler-develコマンドライン ツールが自動的に決定します) を手動で指定することも含まれます。

mainその後、次のように書き換えることができるはずです。

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    myApp (run 8080)

もちろん、wai-handler-fastcgiwai-handler-scgi、またはwairun -handler-webkitから関数を簡単に渡すこともできます。

于 2011-12-17T07:11:25.073 に答える