チャネルの機能を調べるのは簡単です。 channel.xml を定義する XSD スキーマが http://pear.php.net/dtd/channel-1.0.xsd から取得可能です。 channel.xml では以下の要素を定義します。
チャネル名。
チャネル名に対するエイリアス (オプション)。
チャネルの目的についての概要。
ダウンロードやパッケージングの際にパッケージの独自検証を行う オプションのパッケージ。
チャネルがサポートするプロトコルの一覧 (XML-RPC、SOAP および REST がサポートされます)。
ミラーサイトとそのサイトがサポートするプロトコルの一覧。
これは、すべての要素を含んだ channel.xml の例です。
<channel version="1.0" xsi:schemaLocation="http://pear.php.net/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd"> <name>pear.example.com</name> <suggestedalias>foo</suggestedalias> <summary>Example channel.xml</summary> <validatepackage version="1.3.4">Foo_Validate</validatepackage> <servers> <primary port="8080" ssl="yes"> <xmlrpc> <!-- デフォルトのパスは xmlrpc.php です --> <function version="1.0">logintest</function> <function version="1.0">package.listLatestReleases</function> <function version="1.0">package.listAll</function> <function version="1.0">package.info</function> <function version="1.0">package.getDownloadURL</function> <function version="1.1">package.getDownloadURL</function> <function version="1.0">package.getDepDownloadURL</function> <function version="1.1">package.getDepDownloadURL</function> <function version="1.0">package.search</function> <function version="1.0">channel.listAll</function> </xmlrpc> <rest> <!-- デフォルトのパスはなく、必ずベース URL を指定しなければなりません --> <baseurl type="REST1.0">http://pear.example.com/rest/</baseurl> <baseurl type="REST1.1">http://pear.example.com/rest/</baseurl> </rest> <soap path="soapy.php"> <!-- デフォルトのパスは soap.php です --> <function version="1.0">package.listAll</function> </soap> </primary> <mirror server="foo2.example.com/pearmirror"> <xmlrpc path="mirrorxmlrpc.php"> <!-- デフォルトのパスは xmlrpc.php です --> <function version="1.0">package.listLatestReleases</function> <function version="1.0">package.listAll</function> <function version="1.0">package.info</function> <function version="1.0">package.getDownloadURL</function> <function version="1.1">package.getDownloadURL</function> <function version="1.0">package.getDepDownloadURL</function> <function version="1.1">package.getDepDownloadURL</function> <function version="1.0">package.search</function> </xmlrpc> <rest> <!-- デフォルトのパスはなく、必ずベース URL を指定しなければなりません --> <baseurl type="REST1.0">http://foo2.example.com/rest/</baseurl> </rest> </mirror> </servers> </channel> |
チャネル名。これは、提供されているパッケージについての詳細情報を 調べるためにユーザが閲覧するサーバ名となります。 例えば PEAR パッケージは pear.php.net チャネルにあり、PECL パッケージは pecl.php.net チャネルにあります。過去との互換性のため、package.xml バージョン 1.0 を使用している既存パッケージは pear.php.net チャネルに 属するものとみなされます。
サーバ名をチャネル名に使用することの利点は、auto-discovery が 使用できるようになること、パッケージの配置が簡単になることです。
チャネルはドキュメントルートに存在する必要はなく、チャネルにパスを 含めることもできます。例えば以下のようなチャネル名が可能です。 foo.example.com/path/to/pear. <suggestedalias> を指定しない場合、チャネルの利用者は
$ pear install foo.example.com/path/to/pear/Packagename |
とタイプしなければならないことに注意しましょう。
チャネル定義ファイル "channel.xml" がチャネルの ルートディレクトリに存在する必要があります。チャネルが "pear.example.com" の場合、channel.xml が "http://pear.example.com/channel.xml" に存在しなければ なりません。チャネルが "pear.example.com/path/to/pear" の場合、channel.xml が "http://pear.example.com/path/to/pear/channel.xml" に存在しなければなりません。
<suggestedalias> は、パッケージをチャネルからインストールする際に 使用する、短くて使用しやすい名前を定義します。例えば、 pear.php.net チャネルの suggested alias は "pear" です。 チャネルのエイリアスは、6 文字を超えないようにしましょう。 利用者は、インストールやアップグレードの際に毎回これをタイプしなければ なりません。エイリアスが長ったらしいと、大変なことになります。
もともとこのタグは <alias> と呼ばれていましたが、利用者に より柔軟性を提供するために <suggestedalias> という名前に 変わりました。チャネルの所有者が提案 (suggest) するエイリアスが 気に入らない場合、利用者は channel-alias コマンドで簡単に 別のエイリアスを設定することができます。
多くのチャネルでは、パッケージの命名規則や バージョン番号の付与方法については PEAR がデフォルトで提供する 規則で十分でしょう。しかし、中にはこの規則が厳しすぎると感じる チャネルがあるかもしれません。また逆に緩やかすぎると感じることも あるかもしれません。<validatepackage> タグでは それをカスタマイズする機能を提供します。
省略した場合、インストーラは PEAR_Validate クラスを使用します。より緩やかなバージョン番号付与規則を提供する PEAR_Validate_PECL クラスが存在することに 注意しましょう。これは例えば、バージョン番号の規則に違反した際の PEAR の警告にかかわりたくない pecl.php.net のようなチャネルの ためのものです。
<validatepackage> には、version 属性およびテキスト要素が 必要です。テキスト要素にはパッケージ名を指定しなければなりません。 このパッケージ名は、以下のようにインストールできる必要があります。
$ pear install channelname.example.com/Packagename-version |
この節のはじめに示した channel.xml の例では、
$ pear install pear.example.com/Foo_Validate-1.3.4 |
のようになります。さらにこのパッケージでは、パッケージ名に対応する クラスが提供されている必要があり、このクラスは PEAR の命名規約に したがったファイル名 (すべてのアンダースコア "_" を パス区切り文字 "/" に変換します。つまり、Foo_Validate は Foo/Validate.php となります) のファイルに存在する必要があります。 さらにこのクラスは PEAR_Validate を継承していなければなりません。 既存の検証機能を拡張するためには、"validate" ではじまる メソッド (validateVersion() など) を オーバーライドします。
channel.xml および PEAR インストーラでは、ミラーリングが明示的に サポートされています。利用者は、設定オプション default_channel を使用して好みのミラーを 選択することが可能で、channel.xml では使用可能なすべてのミラーを <mirror> タグで記述することができます。
プロトコルの場所を定義し、メインチャネルサーバでサポートされている プロトコルの一覧を定義するために <primary> タグを使用します。 PEAR インストーラがサーバに接続する方法を変更するために、 オプションの属性を使用することが可能です。インストーラが XML-RPC および SOAP サービスに接続する際の方法を定義するために "port" 属性を使用します。REST サービスは、常に 独立した <baseurl> タグで制御されます。
channel.xml は、Web サービスのプロトコルとして XML-RPC、SOAP および REST を認識します。しかし、現時点で PEAR インストーラが サポートしているのは REST のみです。 将来は他の方式もサポートする予定です。今のところ、近いうちに SOAP がサポートされる予定はありませんが、将来それが実装された際にも channel.xml は対応可能なようになっています。
<xmlrpc> および <soap> タグの書式は同じです。それぞれの タグにはオプションの属性 "path" を含めることが可能で、 これによって PEAR に問合せ先 URL を教えます。デフォルトのパスは プロトコル.php、つまり xmlrpc.php あるいは soap.php となります。 言い換えれば、上の例の channel.xml で定義されたチャネル pear.example.com の XML-RPC 関数にアクセスするためには、インストーラは https://pear.example.com:8080/xmlrpc.php (XML-RPC 関数の場合)、あるいは https://pear.example.com:8080/soapy.php (SOAP 関数の場合) に問い合わせます。
<rest> タグは REST の設計思想を反映しています。各リソースは <baseurl> タグ内のベース URL で定義され、インストーラは XML-RPC あるいは SOAP が提供するのと同じ情報を ハイパーリンクを通じて取得します。 必須属性 "type" により、ベース URL から提供される PEAR インストーラ REST インターフェイスのバージョンをインストーラに教えます。
<function> タグは、きわめてシンプルです。必須属性 version によって API を、そしてテキスト要素によって関数の名前を インストーラに教えます。以下のように、バージョンの違う複数の関数を 共存させることが可能であることに注意しましょう。
<function version="1.0">package.getDownloadURL</function> <function version="1.1">package.getDownloadURL</function> |
皆さんの中には「Web サービスを探すために、なぜまた新たな標準を 作ったりするのか?」と思うかたもおられるでしょう。答えは単純です。 channel.xml は、java における WSDL の役割を担うものでは ありませんし、また XML-RPC に取って代わるものでもありません。 channel.xml は、これらの技術の上位階層に位置するものです。 大事なのはサポートされているリモートプロトコルの一覧を すばやく取得することであり、それが何を行うのかを説明することでは ありません。
PEAR インストーラは、一般的なパラメータや返り値のリストが必要ないほど 専門化されており、xml-rpm 関数 package.info バージョン 1.0 が 何を必要として何を返すのかを正確に知っています。 それ以外の情報は、単に帯域およびディスク領域を浪費するだけになります。