PEAR はオープンソースのライブラリであり、パッケージ管理システムであり、コミュニティにより運営されるプロジェクトでもあります。

通常 PEAR はシステム全体で使うようにインストールされますが、アイテマンではプロジェクト毎に PEAR 環境を構築することが推奨されています。プロジェクト毎に PEAR 環境を構築するとどんな利点があるのでしょうか?

MATSUFUJI Hideharu

昨年に株式会社インプレスジャパンから発行された PHP 技術誌「まるごとPHP! Vol.2」に筆者らが執筆させていただいた記事では、プロジェクト毎に PEAR 環境を構築する利点を解説しました。

システム全体で PEAR を使うと、ライブラリのアップグレードや削除によって既存のアプリケーションが影響を受ける可能性が高くなります。プロジェクト毎に閉じた PEAR の環境 (ローカルな PEAR 環境) を用意すれば、ライブラリのアップグレードや削除によって影響を受ける範囲はそのプロジェクトに限定されます。

この記事では紙面の都合で書けなかった、複数の開発者がプロジェクトを共有することを想定したプロジェクトローカルな PEAR 環境を構築する方法を解説します。

ディレクトリ構造

プロジェクト名を myapp とした場合の PEAR 環境のディレクトリ構造とそれぞれの役割を以下のように定めます。括弧内のパラメータは、対応する PEAR 構成パラメータの名称となっています。

myapp
|
+--bin (bin_dir)
|
+--imports
|  |
|  +--PEAR (php_dir)
|  |  |
|  |  +--docs (doc_dir)
|  |  |
|  |  +--cfg (cfg_dir)
|  |  |
|  |  +--data (data_dir)
|  |  |
|  |  +--tests (test_dir)
|  |  |
|  |  +--www (www_dir)
|  |
|  +--non-PEAR
|     |
|     +--spyc-0.2.5
|     |
|
+--tmp
|  |
|  +--pear
|  |  |
|  |  +--cache (cache_dir)
|  |  |
|  |  +--download (download_dir)
|  |  |
|  |  +--temp (temp_dir)
...

PEAR パッケージマネージャの取得と実行

今回は最新の PEAR パッケージマネージャをダウンロードして環境を構築することにします。以下のコマンドで PEAR パッケージマネージャのダウンロードと実行を行います。

wget http://pear.php.net/go-pear
php go-pear

処理を進めていくと PEAR 環境のディレクトリ構造をカスタマイズする画面が表示されるので、先ほど紹介したディレクトリ構造に従って以下のディレクトリを変更します。この段階で対象となる項目は以下の 2 つです。

  • 1. Installation prefix
  • 4. PHP code directory
 1. Installation prefix ($prefix) : /path/to/myapp
 2. Temporary files directory     : $prefix/temp
 3. Binaries directory            : $prefix/bin
 4. PHP code directory ($php_dir) : $prefix/imports/PEAR
 5. Documentation base directory  : $php_dir/docs
 6. Data base directory           : $php_dir/data
 7. Tests base directory          : $php_dir/tests

1-7, 'all' or Enter to continue: 

PEAR パッケージのインストールが完了すると、php.ini を変更するかどうか尋ねられますが、変更しないようにご注意ください。

pear コマンドのプロジェクトローカル化

これで PEAR 環境を構築することができました。これで準備完了といきたいところですが、ちょっとした問題が残っています。いくつかのファイルにインストールを行った環境の絶対パスが埋め込まれているため、このままでは PEAR 環境を他のパスに移動したり、他のマシンでチェックアウトしたりすると pear が正常に動作しません。複数の環境で pear を使うことができませんので、パッケージ管理を行う環境が固定されてしまいます。そこで、2 つのファイルに変更を加えることにします。

変更対象となるファイルのひとつは imports/PEAR/pearcmd.php です。元のコードのままでは、インストールを行った環境の絶対パスが include_path に設定されてしまうため他の環境で pear が正常に動作しない原因となっています。

もうひとつは imports/PEAR/PEAR/Installer.php です。あるパッケージのファイルを削除する場合に参照されるパスは、そのパッケージのインストールを行った環境の絶対パスとなっています。そのため元のコードのままでは、インストールを行った環境以外で pear uninstallpear upgrade などでパッケージのファイルを削除することができません。そのようなゴミが残った状態では、アプリケーションに予期せぬ不具合をもたらすリスクがあります。これらを改善するためのパッチは以下のとおりです。

imports/PEAR/PEAR/Installer.php, imports/PEAR/pearcmd.php に対するパッチ

このパッチを適用すると pear コマンドのプロジェクトローカル化は完了です。これらの変更は PEAR をアップグレードするたびに行う必要があります。

lpear コマンド

以上の作業で pear が動作するようにはなりましたが、pear にプロジェクトローカルな環境を常に認識させるためには、先述のディレクトリ構造を保持するための構成ファイルを作成し、pear 実行時は常に構成ファイルのパスを与える必要があります。この面倒な作業を回避するために、iteman が用意したコマンドが lpear (Windows 版は lpear.bat) です。

bin/lpear
bin/lpear.bat

早速コマンドをダウンロードして実行してみましょう。(Unix 系 OS の場合は実行権限の付与を忘れずに!)

$ bin/lpear config-show
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
config-set succeeded
Configuration (channel pear.php.net):
=====================================
...
PEAR executables directory     bin_dir          /path/to/myapp/bin
PEAR documentation directory   doc_dir          /path/to/myapp/imports/PEAR/docs
PHP extension directory        ext_dir          /usr/lib/php5/20060613+lfs
PEAR directory                 php_dir          /path/to/myapp/imports/PEAR
PEAR Installer cache directory cache_dir        /path/to/myapp/tmp/pear/cache
PEAR configuration file        cfg_dir          /path/to/myapp/imports/PEAR/cfg
directory
PEAR data directory            data_dir         /path/to/myapp/imports/PEAR/data
PEAR Installer download        download_dir     /path/to/myapp/tmp/pear/download
directory
PHP CLI/CGI binary             php_bin          /usr/bin/php
php.ini location               php_ini          
PEAR Installer temp directory  temp_dir         /path/to/myapp/tmp/pear/temp
PEAR test directory            test_dir         /path/to/myapp/imports/PEAR/tests
PEAR www files directory       www_dir          /path/to/myapp/imports/PEAR/www
...
User Configuration File        Filename         /path/to/myapp/bin/pear.conf
System Configuration File      Filename         /usr/etc/pear.conf
$ bin/lpear list -a
Installed packages, channel __uri:
==================================
(no packages installed)
Installed packages, channel doc.php.net:
========================================
(no packages installed)
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.3   stable
Console_Getopt   1.2.3   stable
PEAR             1.7.2   stable
Structures_Graph 1.0.2   stable
Installed packages, channel pecl.php.net:
=========================================
(no packages installed)

lpear は環境に pear.conf (pear.ini) がない場合にそれを作成し、2 回目以降は作成済みの pear.conf (pear.ini) を使用します。lpear によって作成される pear.conf (pear.ini) は環境に依存しているため、ソフトウェア構成管理システムの管理対象に含めないように注意してください。

include_path を構成する

ここまでの作業を終えたら、あとはこの環境を使うために include_path を構成するだけです。アプリケーションのブートストラップコードに以下のような記述をするといいでしょう。

<?php
...
$projectRoot = realpath(...);
set_include_path("$projectRoot/src" . PATH_SEPARATOR .
                 "$projectRoot/imports/PEAR" . PATH_SEPARATOR .
                 "$projectRoot/imports/PEAR/src" . PATH_SEPARATOR .
                 "$projectRoot/imports/non-PEAR/spyc-0.2.5"
                 );
unset($projectRoot);
...

ここで重要なのは、プロジェクトの環境以外には決してアクセスできないように include_path を構成することです。

こうして作成されたプロジェクトの環境は本番環境へのデプロイメントでも強みを発揮します。もうシステム全体の PEAR 環境に気を配る必要はありません。アプリケーションを動作させるためには、単にプロジェクトの環境をコピーすればいいのです。

参考文献

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント