StackでHaskellのプロジェクトをビルドする
StackでHaskellのプロジェクトの生成、ビルドをします。 メモです。
Hello world
プロジェクトを作らず、stack経由でghcを呼び出してビルドしてみる。
Main.hs
という名前でHello worldするプログラムを保存する。
module Main where main :: IO () main = putStrLn "Hello from Haskell!"
ghc
, runghc
が動くことを確認する。
$ stack exec -- ghc Main.hs $ ./Main Hello from Haskell! $ stack exec -- runghc Main.hs Hello from Haskell!
プロジェクトの作成
第三引数であるtemplateをなしにするとデフォルトのプロジェクトを作成する。
stack new my-project
例えばrio
やyesodweb/sqlite
がtemplateとしてある。
stack new my-project rio
ビルド
プロジェクトのビルド
プロジェクトを作成したばかりなら最初にsetupする。
setup
によりプロジェクトに適したバ一ジョンのGHCを入れることができる。
stack setup
`stack buildでビルドを開始する。
stack build
オプション
stack build --help
に色々と載っている。
- stack build --file-watch
- ファイルが編集されていれば自動で再コンパイルしてくれる
- stack build --fast
- -O0
でコンパイルする。
stack build --fast --file-watch
とすると-O0
で勝手に再コンパイルしてくれるようになる。
実行例
stack new rio-test rio <省略>... cd rio-test ls app ChangeLog.md LICENSE package.yaml README.md rio-test.cabal Setup.hs src stack.yaml test stack build <省略>... stack run We're inside the application!
stack run
で実行可能なアプリケ一ションの1つめを実行することができる。
上記の例ではapp/Main.hs
から出来たプログラムが実行されている。grepか何かで出力元を探すとsrc/Run.hs
が実行されているがapp/Main.hs
はそのRun.hs
内のrunRIO
を呼び出している。なので、適当にデバッグ出力をapp/Main.hs
に挿入するとそこもうまく評価されていることを確認できる。
下記のコ一ドは既存のapp/Main.hs
にBangPatterns
を使ってDebug.Trace.trace
を正格評価させた処理を追加したもの。
{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE BangPatterns #-} module Main (main) where import Import import Run import RIO.Process import Options.Applicative.Simple import qualified Paths_test2 import Debug.Trace main :: IO () main = do (options, ()) <- simpleOptions $(simpleVersion Paths_test2.version) "Header for command line arguments" "Program description, also for command line arguments" (Options <$> switch ( long "verbose" <> short 'v' <> help "Verbose output?" ) ) empty lo <- logOptionsHandle stderr (optionsVerbose options) pc <- mkDefaultProcessContext withLogFunc lo $ \lf -> let !_ = Debug.Trace.trace "Test" () in let app = App { appLogFunc = lf , appProcessContext = pc , appOptions = options } in runRIO app run
実行結果
stack run Test We're inside the application!
その他
stack execでサンドボックス下でコマンドを実行できる
stack exec -- <command>
自分の環境では
ghc --version The Glorious Glasgow Haskell Compilation System, version 8.0.2 stack exec -- ghc --version The Glorious Glasgow Haskell Compilation System, version 8.6.4
となっていたのでstackによってHaskellの環境が変わることがわかる。
stack exec -- <command>
の<command>
は何でもよくてstack exec -- bash
するとstackの上でシェルを起動てきたりする。この状態でのghcはstackに影響される。
ghc --version The Glorious Glasgow Haskell Compilation System, version 8.6.4
さいごに
今回はstack new
でデフォルトのプロジェクトを生成したりテンプレ一トからプロジェクトを作ってstack run
を実行してみました。
参考
の章にあるリンクにかなり詳しく書いてのでおすすめです。
参考
- Haskell環境構築20151226最新版4投稿済み_stack-1.0.0対応版.md
- stackのインスト一ル、ghcのバ一ジョンの指定、パッケ一ジの管理, パッケ一ジの登録について
- Stackのドキュメント
- ドキュメント
- シェルの補完やパッケ一ジの依存関係のdot出力なども書かれている。ここ