How FatPacker Works

https://metacpan.org/pod/App::FatPacker について知るしかない!

What is FatPacker?

perlを実行したら

Can't locate Moo.pm in @INC...

などとでてくることは日常茶飯事である。

これは文字通りMoo.pmがないからであり、おそらく

cpanm Moo

とすれば解決する。

しかし

  • めんどくさい
  • Can't locate Moo.pm in @INC と出た時点で放棄する人が続出する

などの理由によりこれをなんとかしたい。

ここで出てくるのが FatPacker である。すなわちFatPackerはスクリプトに依存モジュールをすべて同封してくれる。

How FatPacker Works

例として script.pl は Hello module を require しているとしよう。

> cat script.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Hello;
print Hello::world;

> cat Hello.pm
package Hello;
use strict;
use warnings;
sub world { "Hello, world\n" }
1;

このとき script.pl に Hello.pm を同封したい。

先のエントリーで @INC にはオブジェクトも入れられるといった。これを利用すればいい。 すなわち script.pl の先頭に以下のようにして Hello.pm をぶちこむ。

#!/usr/bin/env perl
BEGIN {
    {
        package My::FatPacker;
        my $hello_content = <<'...';
package Hello;
use strict;
use warnings;
sub world { "Hello, world\n" }
1;
...
        sub My::FatPacker::INC {
            my ($self, $module_filename) = @_;
            return if $module_filename ne "Hello.pm";
            open my $fh, "<", \$hello_content;
            $fh;
        }
    }
    unshift @INC, bless {}, My::FatPacker;
}

use strict;
use warnings;
use Hello;
print Hello::world;

これがまさにFatPackerがやっていることである。

まとめ

FatPacker を使わざるを得ない。