[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 が出来上がっているはずです。あとは手で綺麗に仕上げてください。
雑なコードなんで雑な用途には有用だと思います。