<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 拡張モジュール ssh2SSH_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 つのタグが サポートされており、これでバージョンを定義します。

  • <min> - この package.xml をインストールするために要求される PEAR の最小バージョン。このタグは、package.xml の <pearinstaller> 依存性の中で必須です。

  • <max> - サポートしている PEAR インストーラの最大バージョン。 使用する際には注意してください! このタグを使用すると、PEAR の 新しいバージョンを使用している人がパッケージをインストール できなくなってしまいます!

  • <recommended> - PEAR インストーラの推奨バージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。

  • <exclude> - 互換性のない PEAR インストーラのバージョン。 これは、パッケージを正常にインストールすることができない PEAR のバージョンを避けるために使用します。複数のバージョンを 指定する場合には、<exclude> タグを複数指定します。

<php> 依存性

バージョン情報をサポートしている他のすべての依存性タグと同様、 以下の 4 つのタグがサポートされており、これでバージョンを定義します。

  • <min> - この package.xml をインストールするために要求される PHP の最小バージョン。このタグは、package.xml の <php> 依存性の中で必須です。

  • <max> - サポートしている PHP の最大バージョン。

  • <exclude> - 互換性のない PHP のバージョン。 これは、パッケージを正常にインストールすることができない PHP のバージョンを避けるために使用します。複数のバージョンを 指定する場合には、<exclude> タグを複数指定します。

<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 種類のパッケージ依存性を サポートしています。

  1. チャネルサーバを基にした、通常のパッケージ依存性 (package.xml 1.0 と同じ考え方)。

  2. PHP 拡張モジュールを提供するパッケージ (PECL など) との依存性 (サーバベースおよび URI ベースの両方)。

  3. 静的な URI を基にしたパッケージ依存性。

チャネルを基にした <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> タグがサポートされており、これによって 反依存性をサポートします。

  • <min> - 依存性を満たすために必要な最小バージョン。 対象パッケージがインストールされており、そのバージョンが ここで指定されているバージョンより古い場合に インストールは失敗します。

  • <max> - 依存性を満たすために必要な最大バージョン。 対象パッケージがインストールされており、そのバージョンが ここで指定されているバージョンより新しい場合に インストールは失敗します。

  • <recommended> - 依存性を満たす推奨バージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。

    <compatible> タグを依存側の package.xml で使用することにより、インストーラの制限を 回避できることに注意しましょう。本質的には、 <compatible> タグは、たとえそれが推奨バージョンでなくても 依存パッケージが現在のパッケージと互換性があるということを インストーラに知らせます。

  • <exclude> - 互換性のないパッケージのバージョン。 複数のバージョンを依存性から排除するには、 <exclude> タグを複数指定します。

  • <conflicts> - 依存性を否定します。 もしパッケージがインストールされていれば、依存性の要求は 満たされずにインストールが失敗します。

package.xml 1.0 の "rel" 属性を package.xml 2.0 形式に変換するための大まかな方法を以下に示します。

package.xml 1.0 のパッケージ依存性を package.xml 2.0 に変換する
1.0 2.0 での同等な形式
<dep type="pkg" rel="has">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
</package>
<dep type="pkg" rel="ge" version="1.0.0">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <min>1.0.0</min>
</package>
<dep type="pkg" rel="gt" version="1.0.0">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <min>1.0.0</min>
 <exclude>1.0.0</exclude>
</package>
<dep type="pkg" rel="le" version="1.0.0">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <max>1.0.0</max>
</package>
<dep type="pkg" rel="ge" version="1.0.0">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <max>1.0.0</max>
 <exclude>1.0.0</exclude>
</package>
<dep type="pkg" rel="ge" version="1.0.0">Foo</dep>
<dep type="pkg" rel="le" version="1.9.0">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <min>1.0.0</min>
 <max>1.9.0</max>
</package>
<dep type="pkg" rel="not">Foo</dep>
<package>
 <name>Foo</name>
 <channel>pear.php.net</channel>
 <conflicts/>
</package>

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> タグの中に秘密があります。 このタグにより、依存性の検証時に以下の処理を行うよう インストーラに指示します。

  1. 拡張モジュール "PDO" がメモリ内に存在するか? もし存在するなら、そのバージョンは 0.3.1 以降か?

  2. もし存在しないなら、このパッケージと同時に pecl.php.net/PDO をインストールしようとしているか? しているなら、そのバージョンは 0.3.1 以降か?

  3. していないなら、pecl.php.net/PDO の バージョン 0.3.1 以降がインストールされているか?

上の 3 つの条件のうちひとつでも満たしていれば、依存性は満たされて インストールが続行されます。このシステムにより、 PHP 拡張モジュールをインストールするために別の php.ini を 使用することを可能にし、拡張モジュールに依存した安全装置を 提供します。

<providesextension> は、PHP におけるすべての拡張モジュールに 関する関数と同様、大文字小文字を区別します。"PDO" 拡張モジュールを表すのに "pdo" を使用しないでください。 さもないと、依存性は常に満たされなくなります。

<extension> 依存性

バージョン情報をサポートしている他のすべての依存性タグと同様、 標準のバージョン情報タグ (min、max、recommended、exclude) をすべてサポートされています。それに加えて <conflicts> タグがサポートされており、これによって 反依存性をサポートします。

  • <min> - この package.xml をインストールするために必要な PHP 拡張モジュールの最小バージョン。

  • <max> - サポートされる PHP 拡張モジュールの最大バージョン。

  • <recommended> - 推奨される PHP 拡張モジュールのバージョン。 このタグは、バージョンの管理をより厳しくするために使用します。 --force オプションを指定しない限り、推奨バージョンに 一致していないバージョンではインストールできなくなります。 これは、特別なセキュリティのレベルを提供するために使用できます。 パッケージのインストールが正しく動作することを確認済みの バージョンを指定したうえで、さらに将来のアップグレードを 妨げることもなくなります。

  • <exclude> - 互換性のない PHP 拡張モジュールのバージョン。 複数のバージョンを指定する場合には、<exclude> タグを複数指定します。

  • <conflicts> - 依存性を否定します。 もし拡張モジュールが存在すれば、依存性の要求は 満たされずにインストールが失敗します。

<os> 依存性

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> 依存性

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 のバージョンなどが含まれます。

<compatible> で、バージョンの制限を緩和する (Previous) <contents> で使用する独自のファイルロールを記述する (Next)
Last updated: Sun, 21 Dec 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.