$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

社内Cartonコードリーディング会第一回のメモ

 最近社内でCartonを使う機会が増えてきているのですが、そもそもCarton自体が何やってるかちゃんと把握できてなくてハマったりするので、社内有志でコードリーディング会を開催しています。今回は第一回のときに出てきに作ったメモを公開します。そのままメモを公開しただけなのでかなり雑です。間違ってることも多いと思います。

今回の目的

  • carton install周りで何が起こっているかざっと把握する

疑問とか

  • snapshotが環境によってずれることがあるけどどうして?
  • --deployment, --cachedとかがついた時に何が変わるか
  • cachedしてもcpanにfallbackしてたけどなぜ
  • インストール先の切替はどうするのか
  • そもそもversion固定どうやってるか
    • 順序は関係なくversionが固定されるのか
  • cpanfileはperlスクリプトとして認識されるのか
  • local以下に別のモジュールを入れるとsnapshotに記録されてしまう問題
  • on test, on developなどはいみあるのか

いろいろわかったこと

carton概要

  • cartonはcpanfileとcpanfile.snapshotの取り持ちを行っているだけで、いろいろなもののwrapperになっているだけ
    • インストール系はcpanm
    • メタ情報の取得系はCPAN::Meta系
    • cpanfileのことはModule::CPANfileとか
  • snapshotを作る部分が肝だけど、まだ読み込めてない

--deployment, --cached

  • cpanmに渡すオプションが変わってる
  • --deploymentだとcpanmに渡す--cascade-searchオプションがoffになる
  • --cachedだとmirrorにvendor/cacheが追加される
  • --cascade-searchがoffだと別mirrorにfallbackされない?

cachedつけてもfallbackする件

  • local/vendor/cacheがmirrorに追加されるけど、fallbackはされる
  • cachedとdeploymentが両方してるとfallbackされないかもしれない
    • deploymentだとcascade-searchがoffになるため

インストール先の切替

インストールパスの見つけ方
  1. --pathの指定があったらそれを使う
  2. PERL_CARTON_PATHが指定されていたらそれを使う
  3. そうでなかったらcpanfileと同じディレクトリのlocal以下
cpanfileの見つけ方
  1. cpanfileオプションを見る
  2. PERL_CARTON_CPANFILEオプションを見る
  3. なにもしていなかったら現在のディレクトリを上に遡っていって、/までたどる

versionの固定をどうやっているか

  1. snapshotからcpanのindexファイルを作る
  2. cpanmにそのファイルを--mirror-indexオプションで渡す
  3. cpanmはそれに従ってインストールする

この時

  • --deploymentが付いていると他のmirrorにfallbackされないため、snapshotに書いていないものはインストールできずにエラーが起こる
  • deploymentで無ければ、通常のmirrorにfallbackされるので、cpanfileにしか書いてないモジュールもインストールされる、もしくはアップデートされる

その他

  • 同じモジュールで複数のversionだったら常に新しい方になりそう

cpanfileはperlスクリプトとして認識されるのか

  • 実装としてはperlスクリプトとして一応評価される
  • Module::CPANfileの方に実装がある

snapshotの作り方

まだ色々わかってない。わかったことだけ。

  • 基本的にlocal/lib/perl5/(archname)/.meta/以下のメタ情報を使って作成する
  • この時cpanfileを見ていなくて(???)、local以下にあるもの全て使う
  • snapshotに入れるかどうかの条件があって、いろいろやってる
    • まだ全部わかってない
    • install.jsonがあったら、そのディレクトリのMYMETA.jsonを利用してる
  • なので適当にlocal以下に別モジュール入れるとsnapshotに入っちゃいそう
  • 逆にそのinstall.jsonを消すとsnapshotに入らなくなる

on test, on develop

  • withoutでdevelopとかfeatureとか消せる
  • このへんの扱いはModule::CPANfileでグルーピングされたあと、cpanmがいい感じにあつかう?

第二回の話

 昨日第二回をやって、その時のテーマはcpanfile.snapshotをどうやって作っていっているかという観点でコードリーディングをしました。またまとめ次第公開しようと思います。