スクリプトのバイナリ化

昨日のエントリの続き。


どうせならPerlの実行環境を持っていない人にも配布できたらと思って、[PAR] perlをexe化 :: ぼくはまちちゃん!を参考にバイナリ化しようとしてみたけど、撃沈。Web::Scraperの中で、HTML::TreeBuilder::XPathがnewできてないのは何故・・・?

Yahoo!フォトから画像一括ダウンロードするスクリプトを組んでみた - @ikikko のはてなダイアリー

これが気になったので、ちょっと調べてみました*1。エラーはこんな感じ。

Can't locate object method "new" via package "HTML::TreeBuilder::XPath" at Web/Scraper.pm line 83.

中を見てみると、HTML::TreeBuilder::XPathはしっかりlibディレクトリ中にあります。あ、けどnewが宣言されていない。これは親クラスのHTML::TreeBuilderで宣言されているみたいです。試しに「use HTML::TreeBuilder」を加えてみると…OK!で、Encodeのfrom_to関数でも同じような感じのエラーが起きたんで、Encode::JPも明示的に宣言。はい、エラーが回避できました。

これって、宣言されているモジュールしかバイナリ化ファイルに組み込まれないってこと?親クラスから継承しているメソッドを使用している場合は、そのモジュールも明示的に宣言しないといけないっぽい。ま、何でもかんでも組み込んでいったら、それだけで容量が膨大なものになるでしょうから、その判断は正しいと思いますが。

ちなみに、はっきり検証はしていないので、間違いあったら突っ込みお願いしますw


めでたく、PARによるPerlスクリプトのEXE化ができました。これで、結婚式の参加者に配りやすくなりますね。あとの問題は、そもそも誰も欲しがらないであろうということだけ・・・w

*1:ちなみに、参考サイトでも述べられているけど、PARで作成されたEXEファイルは拡張子をZIPに変えるだけで中身を見ることができます