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のように使いどころがうまくはまっていれば便利かもしれません。