1枚のスクリプトに全てをまとめてくれるApp::FatPacker
App::FatPackerとは、依存モジュールを全て1つのファイルに押し込んでパックしてくれるライブラリです。CPANにあります。
pack your dependencies onto your script file
http://search.cpan.org/~mstrout/App-FatPacker-0.009001/
依存モジュールを解決して1枚のスクリプトにまとめてくれるようです。
perl使いの間で大人気の「cpanm」でもこれが使われています。
どっかでcpanmの紹介として「1枚岩のスクリプト」みたいな表現を目にしましたが、要するにこれのことを指していたようです。
ちなみに作者はlocal::libの人。
「ファット」って響きが心に刺さりますが、id:miyagawaさんも使ってることだし、きっと良質モジュールなんだろうなーと思って触ってみました。
使ってみて
まずいきなりですが、SYNOPSISが間違えています。
fatpack tree fatlib `cat packlists`
と書いてあるところ、素直にそのまま実行するとエラーになります。
ソースをざっと見た感じ、第2引き数と第3引き数あたりが、とても怪しい感じ。
それからSYNOPSISで次の行に書いてある
(fatpack file; cat myscript.pl) >myscript.packed.pl
も、なんだか意味がわかりません。
で、いろいろと苦労していたら以下のページを発見。
http://twitter.com/uasi/statuses/13145562851
App::FatPacker でちょいハマったのでメモ。man には fatpack tree fatlib `cat packlists` とあるが fatlib はいらない。fatpack file するときは lib ディレクトリがないと死ぬ。空でいいので作っておく。
なーんだ、やっぱりそうだったか。
さらに以下のページを発見。
http://friendfeed.com/tyru/1f1473b6/uasi-app-fatpacker-pack
uasi: App::FatPacker 使うのわりとめんどくさいんで一発で pack できるスクリプト書いた http://gist.github.com/385661
おお、たしかにこのステップは面倒だよね。自動化してくれると助かります!
ということで、http://gist.github.com/385661 に置いてあるシェルを使ってみたところ、無事にfatpackに成功しました。やったね!
今後の課題?
fatpack.shのお陰で楽々パッキングだぜ!と思ったいたら、いきなりHTML::TreeBuilder::XPathを使っているスクリプトのパッキングでこけました。
「HTML::TreeBuilder::XPath::Nodeが見あたらねぇよ」と言われます。
調べてみたらHTML::TreeBuilder::XPathにはNode.pmというファイルは存在していませんでした。
実際にはXpath.pmの中でpackage HTML::TreeBuilder::XPath::Nodeが定義されています。
つまり、パッケージとしては存在しても、実際にpmファイルが存在していないというケースだとエラーになります。むむ、こういうケースって結構多い気がするんですよね。
他にもUNIVERSAL::requireで動的にモジュールをロードする場合とかも問題ありそう(ためしてないけど)。
ということで、App::FatPacker、色々と課題はありそうですが、cpanmのように使いどころがうまくはまっていれば便利かもしれません。