App::FatPacker::Simple

App::FatPacker::Simple というのを書いた。

これはモジュールの依存関係は 使う人が理解しているという前提 で fatpack するところだけいい感じでやってくるやつである。

INSTALL

> cpanm git://github.com/shoichikaji/App-FatPacker-Simple.git

App::FatPacker との関係

App::FatPacker は、あるスクリプトを その依存モジュールをすべて含めた形にまとめてくれるツールである。

利点としては、

  • 依存もすべてまとめた一枚スクリプトになるのでポータビリティーが格段にあがる。
  • あとで FatPacker でまとめればいいという安心感から、スクリプトを幾つかの module に分けて書ける。

がある。実際 cpanminus は fatpack された形で配布されていて その利点を多くの人が享受しているように思う。

一方で一度やってみればわかるが App::FatPacker は、はまりどころにあふれていてなかなか使いこなせない。

App::FatPacker は大きくわけて

  1. あるスクリプトが依存しているモジュールを調べて、
  2. 依存モジュールを含めた fatpacked スクリプトを作る

をやっている。 この 1. が特にはまりどころ満載で、 2. については単に融通が利かないという感じである。

App::FatPacker::Simple は 1. については使う人がしっかり理解しているという前提で、2. だけの面倒を見る。

個人的に 1. を機械的に解決するのは無理だと思っている。

使い方

(以下の例は https://github.com/shoichikaji/fatpack-example にある)

例えば hello.pl があり、それは lib/Hello.pm, lib/Hello/CLI.pm を元にしているとしよう。 また外部依存モジュールは cpanfile に書かれているとする。

> find .
.
./cpanfile
./hello.pl
./lib
./lib/Hello
./lib/Hello/CLI.pm
./lib/Hello.pm

> cat cpanfile
requires "Sub::Retry";
requires "HTTP::Tiny";

App::FatPacker::Simple およびそのフロントエンド fatpack-simple は カレントディレクトリの lib, local, fatlib, extlib ディレクトリにあるモジュールを perl-strip して fatpacked スクリプトを作るだけである。

よってまず 依存モジュールを local, extlib などにインストールする。

> carton install
Installing modules using /Users/skaji/cpanfile
Successfully installed CPAN-Meta-2.143240 (upgraded from 2.140640)
Successfully installed Module-Build-0.4210 (upgraded from 0.4205)
Successfully installed Sub-Retry-0.06
3 distributions installed

# Sub::Retry は parent モジュールに依存すると **あなたが理解してる前提**
# HTTP::Tiny も fatpack すべきだと **あなたが理解してる前提**
> cpanm -nq --reinstall -lextlib parent HTTP::Tiny
Successfully reinstalled parent-0.228
Successfully installed HTTP-Tiny-0.053 (upgraded from 0.049)
2 distributions installed

その後、fatpack-simple を実行すればいい。ただしこのままだと build 時しか入らない Module::Build なども入るので それは exclude する。

> fatpack-simple --exclude Module::Build,CPAN::Meta hello.pl
-> perl-strip lib/perl5/parent.pm
-> perl-strip lib/perl5/HTTP/Tiny.pm
-> perl-strip Hello.pm
-> perl-strip Hello/CLI.pm
-> exclude CPAN/Meta.pm
...
-> exclude Module/Build.pm
...
-> perl-strip Sub/Retry.pm

すると hello.fatpack.pl ができる。

ちなみに以上の作業を Daikufile にまとめておくと便利。

> daiku fatpack
# get hello.fatpack.pl

その他

こうしてできた hello.fatpack.pl を実際実行させたい perl (例えば 5.8.8 とか) でテストすべき。

fatpack 自体を perl 5.8.8 などでやるという考えもあるが、 個人的に最新の perl で fatpack を作り、5.8.8 でテストの方がいいと思っている。

Enjoy fatpack!