make済みのtarballから直接モジュールをインストールする方法

ふだんはあまり用事もなかろうと思いますが、たとえばPPM用のtarballのようにすでにmake済みの(blibが存在している)perlモジュールを適当なディレクトリにインストールしたくなったとき。
たとえばうちのリポジトリのローカルミラー(archives/以下にtar.gzファイルがまとまっています)の中身を全部(強制的に)site/lib以下にインストールするスクリプト例はこんな感じになります。

#!perl

use strict;
use warnings;
use ExtUtils::Install;
use Archive::Tar;
use File::Path;
use Config;

my @files = glob('archives/*.tar.gz');
my $tar = Archive::Tar->new;

foreach my $file ( @files ) {
  $tar->read( $file, 'gzipped' );
  foreach my $item ( $tar->list_files ) {
    $tar->extract_file( $item, "tmp/$item" );
  }
  install( {
    'tmp/blib/lib'    => $Config{sitelibexp},
    'tmp/blib/arch'   => $Config{sitearchexp},
    'tmp/blib/script' => $Config{sitebinexp},
  }, 'verbose' );

  rmtree 'tmp';
}

中身については特に説明の必要もないでしょう。詳しく知りたい方はperldoc ExtUtils::Installしてください。

上の例では毎回固定のtmpディレクトリを作っては消していますが、もちろんこんなのはFile::Tempを使った方がスマートですし、ここでファイルをリモートから取ってくるなりなんなりの処理を加えて定期的に回してやれば、開発環境でmakeしたあと固めておいたtarballを自動で本番環境にインストールなんてこともできなくはありません。

まあ、一般的なサイトのデプロイにはrsyncなどを使うでしょうが、ものによってはこんな方法もありますよ、ということで。