昨年に株式会社インプレスジャパンから発行された 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 uninstall や pear 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_iniPEAR 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:
