Install Carton without Carton?

ちょっと前に Carton もバージョン 1.0 がリリースとなり、 plenv や cpanm らを組み合わせた Perl の環境構築は、ひと昔前のそれと比べてずいぶん簡単になりました。

昔話をするつもりはないのですが、大量のモジュールを使ったプロダクトをデプロイするときなど、 perl Makefile.PL; make; make install の定型文をそれはもう腱鞘炎になるほどタイプし続けては、それだけで半日つぶす事もままあったりもしました。このコマンド・セットをタイプする大会があったなら、じぶんはおそらく上位に入賞する事でしょう。

だいたいそんなことになる前に、そのようなルーチン・ワークはバッチ・スクリプトを組んでおくなりすればよかったのですが、──実際それを作った事もありましたが、開発中にいろいろなモジュールを試したりしている中で、そもそも、最終的にどのモジュール(と、そのバージョン)が必要で、それが依存しているモジュールはなんだったっけ? となる事が多く、いったんそうなったが最後、依存関係を探して必要なモジュールをダウンロードして集めては、という茨の作業が始まるのが常でした。つまるところじぶんは、モジュールを管理する上手い方法を知らなかったし、編み出さなかった。

Carton を使うとしても、必要なモジュールがどれかは管理しておかなければならないことに変わりはありませんが、 cpanfile というメモ帳に、「使うモジュール」だけを記しておけばそれでよく、そのモジュールが依存する他のモジュールまで気にしなくていいのが大きな得物です。それどころか cpanm とのコラボレーションで、ダウンロードからインストールまで、すべて面倒をみてくれます。腱鞘炎を心配する事もありません。

そんな Carton のいい事尽くめなところは、あちこちの Perl ユーザが記事にしているので、ここでは繰り返すことはせず、興味を持たれた方はそれらを参照して頂ければと思います。

──ただひとつ、どの記事にも記されていない秘密の?事柄に、じぶは気付きました。なので、それを記してみたいと思います。

Carton は、いちどダウンロードしてインストールしたモジュールを “bundle” しておくことで、 CPAN ネットワークへ接続できない(ファイア・ウォール内などの)環境にもそれらを再構築できる素晴らしい機能を持っているのですが、さて、その機能を使うためには、 Carton がインストールされていなければなりません。

Carton のインストール、 CPAN (モジュール配布サイト)へ繋ぐ事ができれば cpanm Carton とするだけで終わるのではありますが、それができない環境では、 Carton の配布を別途ダウンロードしてそれを対象の環境へアップロード、そして perl Makefile.PL; make; make install とタイプします。もし、依存するモジュールがあれば、先にそれをインストールしておかなければなりません。

これが茨の道の始まりである事は Carton のおかげで過去のこととなった筈なのですが、あろうことか、 Carton 自身が必要とする依存モジュールが、あるわあるわで、終わってみれば、じぶんは Carton-v1.0.11 を含めて 36 個ものモジュールを手動でインストールしていたのでした(補足: Perl 5.18.1 のコアで)。ちょっと、多すぎます。Carton を利用するにあたって唯一ネガティブなところがここにありました。

Carton を Carton を使ってインストールできないでしょうか?

──もちろん、それから以後は Carton の恩恵にあやかるところが甚大ですから、これに怖じ気づいてインストールしない手はないのですが、願わくば、依存モジュールがもう少し減ってくれればとは思うのは正直な所です。

Perl 5.18.1 の中に Carton-v1.0.11 をインストールするためには、つぎの順番でモジュールをインストールする必要がありました(じぶんの手元の環境で、バージョンは現時点での最新版)。

  • App-FatPacker-0.009018
  • App-cpanminus-1.7001
  • Class-Data-Inheritable-0.08
  • Devel-StackTrace-1.30
  • Exception-Class-1.37
  • File-pushd-1.005
  • JSON-2.59
  • Module-Build-0.4007
  • Module-CPANfile-1.0002
  • Module-Reader-0.002000
  • Try-Tiny-0.18
  • autodie-2.21
  • Path-Tiny-0.033
  • strictures-1.004004
  • Module-Runtime-0.013
  • Capture-Tiny-0.22
  • Test-Pod-1.48
  • Test-Fatal-0.012
  • Role-Tiny-1.003002
  • ExtUtils-Config-0.007
  • ExtUtils-Helpers-0.021
  • ExtUtils-InstallPaths-0.009
  • Module-Build-Tiny-0.027
  • Test-Tester-0.109
  • Test-NoWarnings-1.04
  • Test-Deep-0.110
  • CPAN-Meta-Check-0.007
  • Test-CheckDeps-0.007
  • Test-Warnings-0.009
  • Class-Method-Modifiers-2.06
  • Sub-Exporter-Progressive-0.001010
  • Devel-GlobalDestruction-0.11
  • List-MoreUtils-0.33
  • Dist-CheckConflicts-0.09
  • Moo-1.003001
  • Carton-v1.0.11

じぶんは昔の苦い手首の思い出を繰り返すまいと、今回はちゃんと、モジュールをインストールする順番をメモしておきました。あとはこれをもとにバッチス・クリプトを書いて、これらを一発でインストールできるように整えておけば準備万端と言うものです。

おそらく、このことに気付いた方もいるでしょうから、なにかほかにいい手だてがあるのかも知れません(追記:あります!)。もし知っていたら、教えて頂きたいと思うのですが、さもなくば、 Github にそのバッチ・スクリプトを置きましたので、いっしょにメンテナンスして頂ければと思います。

perl-carton - https://github.com/hiroaki/perl-carton

追記:ほかにいい手だてがありました。というより、じぶんが迂闊だっただけかもしれません。この記事を読んでしまっていたらくださったのならば、是非、次の記事も読まなければなりません!

The Carton Bundled a Carton