stackのコードを読んでるのでメモ。まだ全然肝心なところに入ってない。
- パーサーでコマンドライン引数をパースして、パースの結果として得られる関数を実行する作り
- optparse-applicativeをフォークして使っている
- なんの処理を加えてるのかは読んでない
- 例えばbuildだと、実際に走る処理は
buildCmdとなる - 例えば buildCmd だと、コマンドのオプションをパースした結果
BuildOptsCLIを元にパース結果としてGlobalOpts -> IO ()型の処理を生成して返す (runに束縛される) GlobalOptsのパース結果は addCommand によって作られ、runという名前で束縛された実際の処理の引数として使われるbuildコマンドの本命は Stack.Build.build- 設定は Config.hs にて継承関係で定義されている
- 継承関係と言ってるのは、フィールドを用意して明示的に親のデータを持っているという意味
Config>BuildConfigNoLocal>BuildConfigBuildConfigNoLocal>EnvConfigNoLocal>EnvConfigConfig>LoadConfig- 例えばここに書いたデータ型はすべて
HasConfigのインスタンスで、configLというレンズを通してConfigのデータに読み書きできる - DefaultSignatures拡張による
defaultキーワードを使っている(この拡張、知らなかった)