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 を使わざるを得ない。