| ユーザフォーラムで議論/質問 | マニュアル検索 | ハイライト | ハイライトオフ | ポータル | php spot |
<dependencies><dependencies> – package.xml 2.0 における依存性の指定
package.xml 2.0 における依存性の概要依存性を管理するのは大変です。 他人が書いたコードを使うには、それによって自分のコードが動かなくなる危険性を回避するための手段が必要です。 外部のパッケージのバグや予期せぬ API の変更などにうまく対応しなければなりません。 PEAR の依存性管理機能は非常に優れており、これらのリスクを軽減するために使うことができます。 PEAR の開発者は、他のパッケージとの依存性や自分のパッケージの動作要件の設定方法を知っておくことが重要です。 package.xml 1.0 では依存性の記述法は比較的シンプルですが、それほど協力ではありませんでした。 アプリケーションのためにパッケージの依存性を指定するのは危険なことでした。 もしインストールされているパッケージのバージョンをひとつに 指定したければ、それ以降のアップグレードを妨げることに なってしまいます。package.xml 2.0 では、アップグレードを 面倒にすることなしに、より厳しいバージョン依存性の設定を 可能にする方法を提供します。 package.xml 1.0 では、必須の依存性およびオプションの依存性という 2 種類をサポートしています。package.xml 2.0 でもこの 2 つをサポート していますが、さらに「オプションの依存性グループ」という新しい概念もサポートしています (ここに説明があります)。 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> の構造<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.8</min> </pearinstaller> <php> <min>4.2.0</min> </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> タグが必須となります。 オプションの依存性グループオプションの依存性グループを使うと、 必須ではないけれども一括して導入する必要のある機能群を定義することができます。 この機能セットは <package> および <extension> 依存性で構成されています。 たとえば、あるパッケージのオプションとしてリモートシェルでの操作をする機能があるとしましょう。 その場合は、オプションの依存性グループ remoteshell を作って PECL 拡張モジュール ssh2 と SSH_RemoteShell パッケージ (架空のものです) を設定します。 依存性グループは、package.xml で次のように設定します。
<group name="remoteshell" hint="Add support for Remote Shell Operations"> <package> <name>SSH_RemoteShell</name> <channel>pear.php.net</channel> </package> <extension> <name>ssh2</name> </extension> </group>
この依存性グループをインストールするには pear install Packagename#remoteshell のようにします。 <pearinstaller> 依存性<pearinstaller> は、package.xml のパースおよびインストールを 適切に行うための PEAR の最小バージョンを定義します。バージョン情報を サポートしている他のすべての依存性タグと同様、以下の 4 つのタグが サポートされており、これでバージョンを定義します。
<php> 依存性バージョン情報をサポートしている他のすべての依存性タグと同様、 以下の 4 つのタグがサポートされており、これでバージョンを定義します。
<subpackage> 依存性サブパッケージ依存性は、パッケージ依存性と同じ 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> 依存性ご理解いただけるとおり、<package> 依存性は PEAR の依存性の中でも 最も複雑なものです。PEAR 1.4.0 では 3 種類のパッケージ依存性を サポートしています。
チャネルを基にした <package> 依存性パッケージ依存性のうち、最も一般的なのはチャネルベースの依存性です。 これは、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> タグがサポートされており、これによって 反依存性をサポートします。
package.xml 1.0 の "rel" 属性を package.xml 2.0 形式に変換するための大まかな方法を以下に示します。
URI を基にした <package> 依存性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> タグを含めることができます。 PEAR 形式の <package> 依存性 vs. PECL 形式の <package> 依存性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> タグの中に秘密があります。 このタグにより、依存性の検証時に以下の処理を行うよう インストーラに指示します。
上の 3 つの条件のうちひとつでも満たしていれば、依存性は満たされて インストールが続行されます。このシステムにより、 PHP 拡張モジュールをインストールするために別の php.ini を 使用することを可能にし、拡張モジュールに依存した安全装置を 提供します。
<extension> 依存性バージョン情報をサポートしている他のすべての依存性タグと同様、 標準のバージョン情報タグ (min、max、recommended、exclude) をすべてサポートされています。それに加えて <conflicts> タグがサポートされており、これによって 反依存性をサポートします。
<os> 依存性OS 依存性は、特定の系統の OS (unix など) や固有の OS (darwin あるいは freebsd など) のみにパッケージを制限するために使用します。 以下に例を示します。
<os> <name>linux</name> </os>
特定の OS 以外のすべての環境でパッケージをインストール できるよう指定するには、<conflicts/> タグを使用します。
<os> <name>windows</name> <conflicts/> </os>
使用可能な OS の値は以下のとおりです。
さらに、 php_uname() 関数がサポートしているものであれば、どんな難しい OS でも 使用可能です。OS として "unix" を指定すると、 linux、freebsd、darwin、sunos、irix、hpux あるいは aix のすべてが対象となります。 <arch> 依存性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 のバージョンなどが含まれます。 |
各種マニュアル:
PHPマニュアル |
PEARマニュアル |
Smarty(英語)マニュアル |
PHP-GTKマニュアル |
「<dependencies>」をGoogle検索
|