読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

stackのコードを読む

haskell

stackのコードを読んでるのでメモ。まだ全然肝心なところに入ってない。

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