Perlまわりの環境を整備した

Leopardにした and Perl5.10-RC1が出た機会にPerl環境の整備をしたのでそのメモ。要求としては以下。

  1. MacPortsのPerl5.8を使いたい
  2. MacPortsの管理領域(/opt/local)は汚したくない
  3. 最新のCPANモジュールは使いまくりたい
  4. Perl5.10を簡単に試したい

これまでも、MacPortsでインストールしたPerl5.8を使ってた。そのPerlでCPAN使うときには、

$ sudo -H cpan 

としてたんだけど、これはMacPortsの管理領域をいじるので若干気持ち悪かった。

自分でコンパイルしたPerlを使ってもよかったんだけど、SubversionのPerl bindingとかのコンパイル時にPerlを求めるやつのインストールとかはMacPortsでやるのががだんぜん簡単なので、そのへんは楽をしておきたい。

そこで、CPANのモジュールインストール先をHOMEにすれば、万事解決じゃんということでやってみた。システム領域を変更せずにばりばりCPAN使うための常套手段。ついでに出たばっかのPerl5.10-RC1もためせる感じにしこんでおいた。

まずは、$HOME以下に以下のようにディレクトリを作成。

$HOME/perl/
$HOME/perl/perl5.8/    # Perl5.8のCPANモジュールのインストール先
$HOME/perl/perl5.10/   # Perl5.10のインストール先
$HOME/perl/current/    # perl5.8へのシンボリックリンク

otsune's FreeBSD memo :: ユーザー領域にCPANをインストールする方法を参考にMyConfig.pmを設定する。

うちは、これまで使っていたConfig.pm*1を利用した。MyConfig.pmとして$HOME/.cpan/CPAN以下にコピーしたあと、rootのHOMEのPathになっていた箇所を自分のHOMEのPathに置換して、適宜以下のように設定した。

'makepl_arg'   => qq[LIB=$ENV{HOME}/perl/current/lib/perl5 PREFIX=$ENV{HOME}/perl/current],
'mbuildpl_arg' => qq[--install_base $ENV{HOME}/perl/current],

Config.pmがない人はrootユーザでcpanコマンドを実行すると設定が作れる。

最新バージョンのExtUtils::MakeMakerでは、INSTALL_BASEというオプションもきいてModule::Buildの--install_baseと同じ動きをするらしい。なので、新しいExtUtils::MakeMakerを入れた後は、

'makepl_arg'   => qq[INSTALL_BASE=$ENV{HOME}/perl/current],

としておくと良いかも。

あとは環境変数に、

export PATH=$HOME/perl/current/bin::$PATH
export MANPATH=$HOME/perl/current/man:$MANPATH
export PERL5LIB=$HOME/perl/current/lib/perl5:$PERL5LIB

としたら、cpanコマンドでインストールしたモジュールがHOMEにインストールされるようになる。/opt/localを汚さない。そして、MacPortsのPerlからそれらのモジュールを使うこともできる。

いろいろモジュールいれたあと、$HOME/perl/current/binをのぞくとCPANからインストールされたコマンドだけが見れていい感じだわ。

あとはおもむろに、Perl5.10を$HOME/perl/perl5.10にインストールしておいて、5.10を試したくなったときにcurrentのリンク先をPerl5.10にすれば要求4も達成できる。

結局やったのはperl関係のファイルの場所を$HOME/perl/currentで吸収して、柔軟に切り替えられるようにしただけだわな。

この構造は、デフォルトはMacPortsのPerl5.8振る舞いで、一部の振る舞いを$HOME/perl/currentでオーバーライドしたり拡張したりしているクラス構造のように見えるかもしれない。

CPANのモジュールしかインストールされていない$HOME/perl/perl5.8はライブラリのオーバーライドや拡張はするが、コア機能はオーバーライドしていない。perlが丸ごとはいっている$HOME/perl/perl5.10は完全にコアをオーバーライドしてしまっている。しかし、$HOME/perl/currentに入っているプログラム軍はPerlのように振る舞いさえすれば問題ないのだ。つまり、ダックタイピング。

意味解んないですね。

なんかこの休日は、当初の目的もわすれてだらだら所々の環境構築ばかりしてしまっていた。まったく生産的でなくて、ダメ休日のパターンと言えそうである。

Perlベストプラクティス

Perlベストプラクティス

*1:MacPortsのConfig.pmは/opt/local/lib/perl5/5.8.8/CPAN/にある。