詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

自動で cpanfile を記述する試み

[2013-10-31 追記]

tokuhirom ちなみに静的解析でいい場合は scan-prereqs-cpanfile がつかえますね。 http://b.hatena.ne.jp/tokuhirom/20131030#bookmark-167207818

おお、顧客が本当に必要だったものはこれですね! ありがとうございます!


適当に書きあげたスクリプトをそろそろ Carton 化するか〜と思っても cpanfile にいちいち書いてくのは面倒なので lib::xi 的なことをしながら cpanfile を組み立ててくれるコードを書いた。

このエントリの最後に貼ってあるファイルをカレントディレクトリに置いて次のようにスクリプトを実行する。

while ! carton exec -- perl -MCartonPacker foo.pl; do sleep 3; done

挙動は以下のようになってます。

  • require されたモジュールが見つからなかったら cpanfile に追記、carton install して exit 1 する(ので while で異常終了をみて再実行する)
  • carton install が失敗したらそのモジュール名を .cartonpackerignore というファイルに追記して cpanfile を戻す。このモジュールは以降 carton install を試行されなくなる。
  • モジュール名は一度 cpanm --info を通して正規化する。この過程で require されたモジュールと cpanfile に記述されたモジュール名が異なる場合も .cartonpackerignore に追記される。(HTML::TreeBuilder::XPath::Node とか)
  • なので、require を試みられるけど不要なモジュールは .cartonpackerignore にあらかじめ書いとくといい

この while を繰り返して最後にスクリプトが正常終了すると、cpanfile が出来上がっているはずです。あとは手で綺麗に仕上げてください。

雑なコードなんで雑な用途には有用だと思います。

CartonPacker.pm

はてなで一緒に働きませんか?