新しいマシンをすでにあるマシンと同じ Perl モジュール構成にしたい。
そのために、Perl モジュールをまとめてインストールする方法。

今回の環境は Debian GNU/Linux etch.

まず、コピー元マシンにてインストール済み Perl モジュール一覧を取得。


# perl -MCPAN -e autobundle
CPAN: Storable loaded ok
(中略)
Wrote bundle file
    /root/.cpan/Bundle/Snapshot_2007_09_08_00.pm

/root/.cpan/Bundle/Snapshot_2007_09_08_00.pm にインストール済み Perl モジュールリストが構築される。

次に、コピー先マシンにて、CPAN 環境を構築する。


# perl -MCPAN -e shell
(中略)
> install Bundle::CPAN

コピー元マシンから Snapshot_2007_09_08_00.pm をコピー先マシンへファイルコピーする。
ファイルはモジュール検索されるパスに置く。
OS等の構成が同じならコピー元マシンと同じところにおくのがラク。


# cp ./Snapshot_2007_09_08_00.pm /root/.cpan/Bundle/Snapshot_2007_09_08_00.pm

コピー先マシンにて、Perl モジュールをまとめてインストール。


# perl -MCPAN -e 'install Bundle::Snapshot_2007_09_08_00'

シェルがいろいろ訊ねてくるが、選択肢はほぼすべてデフォルト・エンターキーな感じで進めてみた。
なんか困ったところは [Ctrl]+[C]で切り抜けた(てきとー)。
いくつか warning とか出ていた気もするが、まぁ……

# たぶん、コピー元とコピー先ではインストールされたモジュールが完全に一致しない場合もあると思う。

Ref. SENGOKU's Theme - 日経Linux 連載「インターネット・セキュリティ: さらに進んだサーバ構築/運用術」 2001年6月号 第3回「perl (前編)」 pp121-127 (PDF)

いろいろ参考

autobundle はバンドル・ファイルを$CPAN->Config->{cpan_home}/Bundleディレクトリに書込みます。そのファイルには CPANからと現在@INCにインストールされている両方から利用でいるすべてのモジュールが入ります。バンドル・ファイルの名前は現在の日付とカウンタが基本になります。

CPAN - CPANサイトからのperlモジュールの問い合わせ、ダウンロード、構築を行う
生成されるファイルは、CPANインストール・ディレクトリー内に作られます。そのファイルをその場所からコピーするか、あるいは、新しいバージョンのPerlに更新するのであれば、次のように単純にbundle モジュールを実行して、すべてを再インストールします。

$ perl -MCPAN -e 'install Bundle::Snapshot_2004_08_08_00'

bundle ファンクションを使っても構わないのですが、実は私は幾つかの理由から、ネットワーク・ソリューションとしてのバンドル・システムをあまり好きではありません。第1の理由として、バンドルは各コンピューターが同じ構成であることを前提にしています。全てが同じであれば、これでも構いません。しかし、異なるプラットフォームや環境がある場合には、すぐに問題に突き当たります。第2に、autobundle機能では、インストールされている全モジュールをリストアップするため、複数のパッケージをリストアップしてしまいます(個々のパッケージは複数のモジュールを含む可能性があります)。しかしバンドルでは、(一部のモジュール更新のソースとして)後のバージョンのPerlへの参照もリストアップするのです。

最後の問題として、バンドルでは一台のコンピューターが全モジュールの最新バージョンを持っていることを前提にしています。バンドルを使って、標準パッケージを最新バージョン(それが何であれ)に更新することはできません。そのため、ネットワーク環境では使いにくいシステムになります。

IBM Perlモジュールの展開を自動化する - Japan
autobundle はアルファベット順になるので依存関係がうまいこと解消されなかったりしてイマイチですね。

↓の方法の方がいいかもしれない。
入れた順番になるので依存関係がクリアしやすい。

% cat `/usr/bin/perldoc -l perllocal` | perl -MCPAN -nle '/C<Module> L<(.*?)>/ and install "$1"'

perl 5.8.1 built: blog.bulknews.net
あなたの使っているシステムでインストールされているドキュメントのないものや標準リリースにはないものを含めたすべてのモジュール を見つけ出すためには、以下のようにします。

% find `perl -e 'print "@INC"'` -name '*.pm' -print
スクリプティング言語資料室(仮) - perlmodlib - 新たなPerlモジュールを作ったり、既にあるものを検索する
use ExtUtils::Installed
$installed = ExtUtils::Installed->new()
$installed->modules()

インストール済みモジュール一覧 - あーありがち (2007-08-11)

tags: zlashdot Perl Debian Perl

Posted by NI-Lab. (@nilab)