アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » モダンPerlの世界へようこそ » 第18回 local::lib:ふだんと違う環境でPerlを使う

モダンPerlの世界へようこそ

第18回 local::lib:ふだんと違う環境でPerlを使う

いつでも理想の環境を使えるとは限りません

「弘法筆を択ばず」ということわざもありますが,なんであれ手になじむまで使い込んだ道具を持っている人は,環境が変わってその道具が使えなくなるとやはりいらいらするものです。

Perlの場合もそう。日頃から自分の必要や興味に応じてがんがんCPANモジュールをインストールしていると,何らかの事情でまっさらに近いPerlを使わなければならなくなったとき,途方に暮れます。本来のコードを書き始める前に,モジュールのインストールだけで一日潰してしまった経験をお持ちの方も少なくないことでしょう。

今回は,そんな「ふだんと違う」環境でもなるべくストレスなくPerlを使えるようにするためのモダンな努力をいくつか紹介してみます。

PERL5LIBという環境変数を活用する

Perlはディストリビューションに同梱されているコアモジュールを保護するために,CPANからインストールするモジュールをコアモジュールとは別の場所(典型的にはsite/lib以下)に配置できるようになっています。このようにしておくことで,あとからsite/lib以下にインストールしたモジュールが何らかの理由で壊れても,もともとlib以下にインストールしてあったコアモジュールがバックアップの役割を果たせる,というのがそのねらいです。

同様に,Perlにはインストール済みのモジュールを保護するために,-IというスイッチやPERL5LIBという環境変数を利用してモジュールを読み込むパスを変更する仕組みがあります。これを使えば,(明示的にlibプラグマを追加するなどして)アプリケーションやインストール済みのモジュールを改変しなくても,特定の環境でのみ必要なモジュールを使うようにできます。

たとえば,/home/foo/myapp以下に5.7系列の(Mooseに対応していない)Catalystで開発したアプリケーションがあるとしましょう。これがCatalyst 5.8系列でも正しく動作するか確認したいとき,いきなりCPANでCatalystのバージョンアップをするのはやや乱暴なやり方です。このような場合はひとまず/home/foo/catalyst58以下にCatalyst 5.8系列の最新版をリポジトリからチェックアウトするなりtarballをダウンロード・展開するなりして,PERL5LIBに/home/foo/catalyst58/libをセットしてから,myappのテストを実行したり,開発用サーバを起動するのが常套手段。こうすればほかのアプリケーションにはまったく影響を与えず,もともとのコードにもいっさい手を加えずに,新しいモジュールを使ったテストを実行できます。 PERL5LIBに複数のパスを登録したい場合は,Unix系のOSならふつう「:」,Windowsの場合は「;」で区切ります(※1)。また,コンパイルする必要があるモジュールの場合は,単にlibを追加するのではなく,コンパイル後にできるblib以下の各ディレクトリを(/home/foo/catalyst58/blib/lib:/home/foo/catalyst58/blib/archのように)登録します。

もっとも,この例のように外部のモジュールが少ない場合はともかく,大きなアプリケーションの移行テストをするときにPERL5LIBに何十個もパスを列挙するのは現実的ではありません。そのような場合は,どこか(ふだんモジュールをインストールしている場所とは異なる)特定のパスに複数のモジュールをインストールしておいて,そのパスをPERL5LIBに登録する方が簡単です。

たとえば,先ほどの/home/foo/myapp以下のアプリケーションを,Catalyst 5.8だけでなく,MooseやClass::MOPの開発版も入れた状態でテストしたいとしましょう。もちろんPERL5LIBに/home/foo/catalyst58/lib,/home/foo/moose/lib,/home/foo/class-mop/blib/lib,/home/foo/class-mop/blib/archという4つのバスを登録してもよいのですが(Class::MOPはコンパイルが必要なモジュールなので,/home/foo/class-mop/libではなくblib以下のディレクトリを登録する必要があります),それよりは,少しだけ手間はかかりますが,Catalyst 5.8やMooseのディレクトリでもmakeを実行しておいて,/home/foo/catalyst58/blib,/home/foo/moose/blib,/home/foo/class-mop/blibの中身をすべて/home/foo/extlibs以下にコピーし,PERL5LIBには/home/foo/extlibs/libと/home/foo/extlibs/archのみ指定するようにしたほうが便利です。

※1

正しい区切り記号を知りたい場合はこのようなワンライナーを実行してください。

perl -MConfig -e 'print $Config{path_sep}'

旧来の設定の保存の仕方

とはいえ,外部ファイルを更新するたびにいちいちお決まりのコピー先を指定してコピーするのは面倒な話ですし,Perl的ではありません。このような作業はもちろんもっと簡単にできるようになっています。

たとえば,Makefile.PLがExtUtils::MakeMaker(や,それを裏で使っているModule::Install)を使って書かれている場合,「perl Makefile.PL」を実行するときにこのようなオプションを与えておくと,わざわざ自分でblibディレクトリ以下をコピーしなくても,いつものようにmake installすれば指定したディレクトリにインストールできるようになります。

> perl Makefile.PL PREFIX=/home/foo/extlibs
> make
> make install  # /home/foo/extlibs以下にインストール

ExtUtils::MakeMakerが十分新しければ,PREFIXのかわりにINSTALL_BASEなどのオプションを与えることもできます(こちらのほうがパスがより直感的なものになります)。また,これらのオプションはPERL_MM_OPTという環境変数に保存しておくこともできます。この環境変数が定義されていると,直接perl Makefile.PLを実行したときだけでなく,CPANシェルなどからインストールする場合も指定したディレクトリにモジュールをインストールできるようになります(詳細はExtUtils::MakeMakerのPODをご覧ください)。

Module::Buildを使っているモジュールの場合は,インストール時に--install_baseなどのオプションを指定することで同じような処理を行うことができます。

> perl Build.PL
> ./Build
> ./Build install --install_base /home/foo/extlibs

また,MODULEBUILDRCという環境変数を利用すると,Module::Build用のオプションをファイルに保存しておくことができます(こちらも詳細はModule::BuildのPODをご覧ください。なお,Module::Buildの次のバージョンではExtUtils::MakeMakerのようにPERL_MB_OPTという環境変数もサポートされることになっています)。

これらのオプションは,環境変数だけでなく,CPANCPANPLUSの(一時的ないし恒久的な)設定として保存することもできます。はじめてCPANシェルを起動したときにこのようなメッセージが出ていたのを覚えている方もいることでしょう。これや,これに続く関連した設定を切り替えることで,いちいち環境変数を設定しなくても,実験的なモジュールだけ別の場所に仮インストールすることができるようになります。

Every Makefile.PL is run by perl in a separate process. Likewise we
run 'make' and 'make install' in separate processes. If you have
any parameters (e.g. PREFIX, UNINST or the like) you want to
pass to the calls, please specify them here.

If you don't understand this question, just press ENTER.

Typical frequently used settings:

    PREFIX=~/perl    # non-root users (please see manual for more hints)

 
Parameters for the 'perl Makefile.PL' command? [INSTALLDIRS=site]

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス