プログラミングにおいて、依存性は最も難しい問題のひとつです。 バグや API の変更に対応する簡単な方法がなければ、他人が書いた コードを使用することは悪夢となりかねません。他のさまざまな 機能の中でも、依存性の処理はおそらく PEAR の最大の強みでしょう。 あなたが個人的に依存性の重要性をどう考えているかにかかわらず、 依存性を指定する方法やその他特定のシステム上でのみパッケージを 使用させる方法などを知っておくことは重要です。
package.xml 1.0 では、依存性の記述法は比較的シンプルでしたが、 その代わりに使いやすさが犠牲となっていました。アプリケーションの ためにパッケージの依存性を指定するのは危険なことでした。 もしインストールされているパッケージのバージョンをひとつに 指定したければ、それ以降のアップグレードを妨げることに なってしまいます。package.xml 2.0 では、アップグレードを 面倒にすることなしに、より厳しいバージョン依存性の設定を 可能にする方法を提供します。
package.xml 1.0 では、PECL のような PHP 拡張モジュールへの依存性は非常にやっかいなものでした。 インストール時の検証を成功させるには、その拡張モジュールが php.ini に記述されており、またメモリ上に読み込まれている必要が あったのです。実運用環境の Web サイトで使用している php.ini と PEAR インストーラが使用している php.ini が違うなどの理由で、 これが不可能であることも多いものです。package.xml 2.0 では、 PECL のような拡張モジュールに対する依存性はシンプルでわかりやすい ものになりました。つまり、該当モジュールがメモリに読み込まれている 必要はなく、単にインストールされていればそれでよいのです。 もちろん、古い形式の依存性もサポートされています。
package.xml 1.0 では、必須の依存性およびオプションの依存性という 2 種類をサポートしています。package.xml 2.0 でもこの 2 つをサポート していますが、さらに「オプションの依存性グループ」という新しい概念も サポートしています。依存性グループでは機能の組み合わせを定義します。 "このパッケージはオプションで Net_FTP に依存し、オプションで Log に依存する" と考える代わりに、 "パッケージをリモートインストールするには remoteinstall という 機能が必要で、その機能には Net_FTP および Log パッケージが必要" のように考えることができるのです。グループ化によって、 ある機能を正しく使用するために必要なパッケージおよび拡張モジュールの 組み合わせを定義することが可能となります。
package.xml 1.0 では、依存性として php、package および extension のみをサポートしていました。package.xml 2.0 では php、package、extension、os、architecture および PEAR installer をサポートします。それに加えて package.xml 2.0 では 特定の URL に存在する静的なパッケージに対する依存性や PECL のように PHP の拡張モジュールを提供するパッケージに対する 依存性もサポートします。
PEAR installer に対する依存性とは、PEAR パッケージに対する依存性とは 異なり、現在実行している PEAR インストーラに対する依存性のことです。 これは PHP に対する依存性と似ています。というのも、この依存性は 特定のバージョンが実行されていることを要求するからです。 PEAR インストーラの手の焼けるバグのせいでパッケージをインストール できなくすることを避けるために、これは非常に有用です。
<dependencies> タグによって依存性の情報を再構成しました。 依存性はグループ化され、属性の情報はタグに展開されました。 また、わかりやすくして可読性を高めるため、単語を省略することを やめました。package.xml バージョン 1.0 の一部を抜粋した
<deps> <dep type="pkg" rel="ge" version="1.3.1">Archive_Tar</dep> <dep type="php" rel="ge" version="4.2.0"/> <dep type="pkg" rel="has" optional="yes">PEAR_Frontend_Web</dep> </deps> |
は、package.xml 2.0 ではこのような形式になります。
<dependencies> <required> <pearinstaller> <min>1.4.0a7</min> </pearinstaller> <php> <min>4.2.0</min> <max>6.0.0</max> </php> <package> <name>Archive_Tar</name> <channel>pear.php.net</channel> <min>1.3.1</min> </package> </required> <optional> <package> <name>PEAR_Frontend_Web</name> <channel>pear.php.net</channel> </package> </optional> </dependencies> |
これらの変更により、xml の妥当性検証およびパースを単純化しました。 package.xml 1.0 とは異なり、<pearinstaller> および <php> の依存性はすべての package.xml で必須となることに注意しましょう。 さらに、<pearinstaller> および <php> の中では <min> タグが必須となります。
<pearinstaller> は、package.xml のパースおよびインストールを 適切に行うための PEAR の最小バージョンを定義します。バージョン情報を サポートしている他のすべての依存性タグと同様、以下の 4 つのタグが サポートされており、これでバージョンを定義します。
<min> - この package.xml をインストールするために要求される PEAR の最小バージョン。このタグは、package.xml の <pearinstaller> 依存性の中で必須です。
<max> - サポートしている PEAR インストーラの最大バージョン。 使用する際には注意してください! このタグを使用すると、PEAR の 新しいバージョンを使用している人がパッケージをインストール できなくなってしまいます!
<recommended> - PEAR インストーラの推奨バージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。
<exclude> - 互換性のない PEAR インストーラのバージョン。 これは、パッケージを正常にインストールすることができない PEAR のバージョンを避けるために使用します。複数のバージョンを 指定する場合には、<exclude> タグを複数指定します。
バージョン情報をサポートしている他のすべての依存性タグと同様、 以下の 4 つのタグがサポートされており、これでバージョンを定義します。
<min> - この package.xml をインストールするために要求される PHP の最小バージョン。このタグは、package.xml の <php> 依存性の中で必須です。
<max> - サポートしている PHP の最大バージョン。
<exclude> - 互換性のない PHP のバージョン。 これは、パッケージを正常にインストールすることができない PHP のバージョンを避けるために使用します。複数のバージョンを 指定する場合には、<exclude> タグを複数指定します。
サブパッケージ依存性は、パッケージ依存性と同じ xml 書式となります。 サブパッケージ依存性を使用するのは、パッケージが複数に分割される場合のみです。 言い換えれば、もし子パッケージの中に親パッケージと同名のファイルの 旧バージョンが含まれていた場合、通常は子パッケージが親パッケージと 競合します。というのも親パッケージのファイルを上書きしてしまうことに なるからです。
簡単な例を挙げて考えてみましょう。 パッケージ Foo 1.0.0 には Foo.php および Foo/Bar.php が含まれています。 パッケージ Foo の開発者は、Foo を 2 つのパッケージ Foo および Foo_Bar に分けることにしました。Foo 1.1.0 には foo.php が含まれ、Foo_Bar 0.1.0 には Foo/Bar.php が含まれます。この場合、Foo_Bar 0.1.0 は Foo 1.0.0 と競合します。というのも両方に Foo/Bar.php が含まれているからです。
Foo_Bar に対する subpackage 依存性を Foo に設定しておくと、インストーラは Foo 1.0.0 の Foo.php と Foo 1.1.0 の Foo.php の競合を無視するのと同様に Foo 1.0.0 の Foo/Bar.php と Foo_Bar 0.1.0 の Foo/Bar.php の競合も無視します。
ご理解いただけるとおり、<package> 依存性は PEAR の依存性の中でも 最も複雑なものです。PEAR 1.4.0 では 3 種類のパッケージ依存性を サポートしています。
チャネルサーバを基にした、通常のパッケージ依存性 (package.xml 1.0 と同じ考え方)。
PHP 拡張モジュールを提供するパッケージ (PECL など) との依存性 (サーバベースおよび URI ベースの両方)。
静的な URI を基にしたパッケージ依存性。
パッケージ依存性のうち、最も一般的なのはチャネルベースの依存性です。 これは、package.xml バージョン 1.0 で使われていたものです。
<deps> <dep type="pkg" rel="has">PEAR</dep> </deps> |
これを package.xml バージョン 2.0 用に変換すると、以下のようになります。
<dependencies> <required> <!-- ... --> <package> <name>PEAR</name> <channel>pear.php.net</channel> </package> </required> </dependencies> |
標準的なパッケージ依存性では <channel> が必須タグであることに 注意しましょう。package.xml 1.0 を使用していたパッケージは、 そのダウンロード元にかかわらず、チャネルとして pear.php.net を使用します。
バージョン情報をサポートしている他のすべての依存性タグと同様、 標準のバージョン情報タグ (min、max、recommended、exclude) をすべてサポートされています。それに加えて <conflicts> タグがサポートされており、これによって 反依存性をサポートします。
<min> - 依存性を満たすために必要な最小バージョン。 対象パッケージがインストールされており、そのバージョンが ここで指定されているバージョンより古い場合に インストールは失敗します。
<max> - 依存性を満たすために必要な最大バージョン。 対象パッケージがインストールされており、そのバージョンが ここで指定されているバージョンより新しい場合に インストールは失敗します。
<recommended> - 依存性を満たす推奨バージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。
<compatible> タグを依存側の package.xml で使用することにより、インストーラの制限を 回避できることに注意しましょう。本質的には、 <compatible> タグは、たとえそれが推奨バージョンでなくても 依存パッケージが現在のパッケージと互換性があるということを インストーラに知らせます。
<exclude> - 互換性のないパッケージのバージョン。 複数のバージョンを依存性から排除するには、 <exclude> タグを複数指定します。
<conflicts> - 依存性を否定します。 もしパッケージがインストールされていれば、依存性の要求は 満たされずにインストールが失敗します。
package.xml 1.0 の "rel" 属性を package.xml 2.0 形式に変換するための大まかな方法を以下に示します。
表 21-1package.xml 1.0 のパッケージ依存性を package.xml 2.0 に変換する
1.0 | 2.0 での同等な形式 | ||
---|---|---|---|
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
|
URI ベースのパッケージ依存性について見てみましょう。 以下に簡単な例を示します。
<package> <name>Foo<name> <uri>http://www.example.com/Foo-1.3.0</uri> </package> |
この設定により、もしパッケージ Foo がインストールされていない場合に インストーラは http://www.example.com/Foo-1.3.0.tgz あるいは http://www.example.com/Foo-1.3.0.tar (両方が存在する必要があります!) を取得しようとします。URI で表すすべてのパッケージには、 <channel> タグの代わりに <uri> タグが含まれている必要があり、これらは自動的に擬似チャネル "__uri" に属することになります。しかし、このことは URI ベースのパッケージ依存性を表す xml に記述方法を考える上では それほど重要ではありません。
URI ベースのパッケージ依存性では、バージョン管理の情報を指定することが できません。指定しても無意味だからです。静的な URI には、もともとひとつの バージョンしか指定できません。URI ベースの依存性には パッケージと衝突する情報を指定する <conflicts/> タグ、 および該当パッケージが提供する拡張モジュールを指定する <providesextension> タグを含めることができます。
package.xml 2.0 では リリース型 を識別する機能がサポートされており、また PECL 形式のパッケージで extbinrelease 型や extsrcrelease 型を使用する依存性もサポートしています。
PECL パッケージとして配布することができるけれども PHP にデフォルトでバンドルされている拡張モジュール、例えば PDO 拡張モジュールなどへの依存性を指定するには、この形式を使用します。
<package> <name>PDO</name> <channel>pecl.php.net</channel> <min>0.3.1</min> <providesextension>PDO</providesextension> </package> |
<providesextension> タグの中に秘密があります。 このタグにより、依存性の検証時に以下の処理を行うよう インストーラに指示します。
拡張モジュール "PDO" がメモリ内に存在するか? もし存在するなら、そのバージョンは 0.3.1 以降か?
もし存在しないなら、このパッケージと同時に pecl.php.net/PDO をインストールしようとしているか? しているなら、そのバージョンは 0.3.1 以降か?
していないなら、pecl.php.net/PDO の バージョン 0.3.1 以降がインストールされているか?
上の 3 つの条件のうちひとつでも満たしていれば、依存性は満たされて インストールが続行されます。このシステムにより、 PHP 拡張モジュールをインストールするために別の php.ini を 使用することを可能にし、拡張モジュールに依存した安全装置を 提供します。
警告 |
<providesextension> は、PHP におけるすべての拡張モジュールに 関する関数と同様、大文字小文字を区別します。"PDO" 拡張モジュールを表すのに "pdo" を使用しないでください。 さもないと、依存性は常に満たされなくなります。 |
バージョン情報をサポートしている他のすべての依存性タグと同様、 標準のバージョン情報タグ (min、max、recommended、exclude) をすべてサポートされています。それに加えて <conflicts> タグがサポートされており、これによって 反依存性をサポートします。
<min> - この package.xml をインストールするために必要な PHP 拡張モジュールの最小バージョン。
<max> - サポートされる PHP 拡張モジュールの最大バージョン。
<recommended> - 推奨される PHP 拡張モジュールのバージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。
<exclude> - 互換性のない PHP 拡張モジュールのバージョン。 複数のバージョンを指定する場合には、<exclude> タグを複数指定します。
<conflicts> - 依存性を否定します。 もし拡張モジュールが存在すれば、依存性の要求は 満たされずにインストールが失敗します。
OS 依存性は、特定の系統の OS (unix など) や固有の OS (darwin あるいは freebsd など) のみにパッケージを制限するために使用します。 以下に例を示します。
<os> <name>linux</name> </os> |
特定の OS 以外のすべての環境でパッケージをインストール できるよう指定するには、<conflicts/> タグを使用します。
<os> <name>windows</name> <conflicts/> </os> |
使用可能な OS の値は以下のとおりです。
windows
unix
linux
freebsd
darwin (Mac OS X のことです)
sunos
irix
hpux
aix
さらに、 php_uname() 関数がサポートしているものであれば、どんな難しい OS でも 使用可能です。OS として "unix" を指定すると、 linux、freebsd、darwin、sunos、irix、hpux あるいは aix のすべてが対象となります。
arch (アーキテクチャ) 依存性は、特定の OS およびプロセッサのみに パッケージを制限するために使用します。以下に例を示します。
<arch> <pattern>linux-*-i386-*</pattern> </arch> |
特定のアーキテクチャ以外のすべての環境でパッケージをインストール できるよう指定するには、<conflicts/> タグを使用します。
<arch> <pattern>linux-*-i?86-*</pattern> <conflicts/> </arch> |
アーキテクチャのパターンは OS_Guess->matchSignature() メソッドで定義され、sysname[-release[-cpu[-extra]]] のような形式になります。[] で囲まれている部分はオプションです。 また、すべての部分でワイルドカードとして "*" を使用可能です。さらに、1 文字のみを表すワイルドカードとして "?" が使用可能です。たとえば i?86 は i386、i686、i586 などにマッチします。
sysname の意味は OS 依存性と同じですが、unix はサポートされていません。
release は、OS のバージョンです。
cpu は特定の CPU を表します。一般的な値は i?86、sparc、powerpc です。
extra は、php_uname() の最後に付加される その他の項目です。glibc のバージョンなどが含まれます。