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

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

この記事を読むのに必要な時間:およそ 4.5 分

local::libを使って楽をする

これらの機能は,適切に組み合わせれば非常に便利なものです。makeなどの開発用ツールが用意されていれば管理者権限がないレンタルサーバなどでもユーザ領域にCPANモジュールをインストールできるようになりますし,アプリケーションを配布・展開する際にも,必要な依存モジュールだけを特定のディレクトリにインストールしておけば,Perl関係のディレクトリを丸ごとコピーしてまわるより早く展開できます。インストール済みのCPANモジュールをすべてバージョン管理システムに放り込むのはあまり現実的ではありませんが,特定のアプリケーションの依存モジュールだけならバイナリごとバージョン管理してしまってもよいでしょう。

ただ,このような環境変数の設定を毎回手作業で行っているようでは怠惰さが足りません。また,実際にいくつかの環境で設定してみればわかることですが,PERL5LIBに登録すべきディレクトリ階層はインストールされているPerlの設定によってかわります。先ほどの例のようにいつもlibとarchのみ追加すればよいということはなく,Perlのバージョンがパスに埋め込まれていたり,アーキテクチャごとにディレクトリがわかれていたりしますし,このような設定を繰り返していくうちにCPANシェルの設定とPERL_MM_OPTの設定が食い違ったりするようなことも起こりえます。

そのような問題のひとつの解決策として生まれたのが,2007年にマット・トラウト氏がリリースしたlocal::libです。このモジュールは,CPANシェルからインストールするより,自分でtarballを落としてきて手作業でインストールしたほうが便利です。perl Makefile.PLを実行するときに「--bootstrap」というオプションをつけてください。PERL5LIBをはじめとするいくつかの環境変数などの設定を自動的に行ってくれます※2⁠。

> perl Makefile.PL --bootstrap

設定が済んで,make && make installしたら,ドキュメントを参考にしながら.bashrcなどの設定ファイルに環境変数を有効にするために必要な処理を書き込みます。Windowsユーザであればプロンプトだけでなく,コントロールパネル経由でシステムの設定をいじってログイン時に環境変数が有効になるようにする必要もあるでしょう。⁠perl -Mlocal::lib」を実行すると必要な設定が出力されるので参考にしてください。

※2

このときCPANシェルなどにすでにPREFIXやINSTALL_BASEの設定が保存されている場合は処理が中断されてしまいます。メッセージにしたがってCPANなどの設定を解除しておいてください。

リロケータブルPerl

local::libはライブラリの置き場所を変えるためのものでしたが,場合によっては(特にPerlのメジャーバージョンアップのときなどは)複数のperlバイナリを切り替えて使いたくなることもあります。

このとき,日頃からライブラリのアーキテクチャに依存する部分をきちんと分けて管理していればsymlinkの切り替えなどで対応できることもありますが,perlバイナリのなかにはコンパイル時にいくつかのパスが埋め込まれているため,既存のバイナリを一時別の場所に移動して,別の(問題になるのはたいていバイナリパッケージの,でしょうが)perlバイナリを決められた場所にインストールする,ということがしづらくなっています。

そのため,昔は再配置の必要があるときはperlバイナリ(や,Config.pm等の設定ファイル)にパッチをあてるというハックが使われてきたのですが,Perl 5.10系列ではコンパイル時にPerlをリロケータブルにするオプションを選択できるようになりました(詳しくはperl594deltaなどをご覧ください。この変更は5.8.9にもバックポートされています⁠⁠。もう少し具体的に書くと,PerlをConfigureするときに-Duserelocatableincしておくと,@INC(や,%Configに含まれるパス)の値が,実行時に$^X(実行中のperlバイナリの位置)からの相対パスとして計算できるような形で保存されるようになりました。その結果,perlバイナリ(と,それに関連したライブラリ群)をインストールした場所とは異なる任意の場所に移動しても,⁠インストールした位置にあったライブラリでなく)連れてきたライブラリをロードできますし,Configモジュールなどに保存されている設定に依存しているモジュールも正しく動作するようになっています。

Perl on a Stick

もっとも,このリロケータブルPerlは当然ながら実行時に余計な計算が増えます。だから,今後もOS付属のパッケージ管理システムなどに登録されるPerlがリロケータブルになることはあまり期待できませんし,どのみちコンパイルしなおす必要があるのなら,わざわざリロケータブルにしなくても,最初からインストール先を別のディレクトリにしておけばよいだけのようにも思えます。

が,たしかにこのようなリロケータブルPerlが役に立ちそうな局面はあります。

たとえば,USBメモリにPerlをインストールする例を考えてみましょう。カンファレンスで,研修で,あるいは得意先でプレゼンテーションなりデモなりを行うとします。適当なマシンにUSBメモリを指して,どのドライブ,どのパスにマウントされるかはわかりませんが,そこに移動して,USBメモリ内にインストールしておいたPerlを使ってアプリケーションを実行できれば,わざわざ重たいノートパソコンを持ち歩く必要はありません。アーキテクチャさえ一致していれば,相手先のPC(やPerl)の設定によらず動作することが期待できますし,USBメモリなら安価ですからそのまま納品物として渡してしまっても懐は痛みません。もちろん仮想マシンを丸ごとUSBメモリに放り込めば似たようなことはできますが,Perlと必要なライブラリだけ入れておくのとどちらが楽かは言うまでもないでしょう。十分な容量があるなら,USBメモリ上にCPAN::MiniによるCPANのスナップショットも構築しておけば,ネットワークにつなげない場所でも自由にPerlアプリケーションの開発を進められます――

といった思惑のもと,2008年にPerl Foundationの助成金を受けて,いまもなお開発が進められているのが,Perl on a Stickという,おもにStrawberry Perlをポータブルにするためのプロジェクトです。

このPerl on a Stickの根幹となっているStrawberry Perl自体はいまのところuserelocatableincを使ってコンパイルされているわけではないのですが(現時点ではuserelocatableincはUnix系のOSでしかサポートされていないようです⁠⁠,本稿執筆時点ではConfig,CPAN,File::HomeDirCPAN::Miniという4つのモジュールをポータブルにするPortableというディストリビューションを同梱してポータブルなモジュールのロードなどに対応しています。

興味のある方はStrawberry PerlのサイトからPerl 5.10.1のリロケータブル版がダウンロードできますのでお試しあれ。適当なディレクトリに解凍して,perlバイナリや同梱されているMinGWのバイナリがあるディレクトリのパスを通してやれば,ふつうに使えるはずです。

ガジェットとPerl

gihyo.jpでも昨年たのしいchumbyと題した連載がありましたから覚えている方も多いと思いますが,歴史が古く,どこにでも入っているPerl(とPython)は,ときおりガジェット類との組み合わせで話題になることもあります。

2009年4月に開催されたShibuya Perl Mongersのテクニカルトークでは,ジェシー・ヴィンセント氏が最近国内でも入手できるようになったKindleという電子ブックリーダー上でPerlをコンパイルするというネタのさわりの部分を紹介していました。このときは残念ながら時間切れで肝心のところまでたどりつけませんでしたが,slideshareにはそのときのスライドが公開されています。だれもが真似できるようなものではありませんが,今度はどんなガジェットでPerlが使えるというネタが出てくるのか,楽しみなことですね。

著者プロフィール

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

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

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