Pirumを使ってみた

先日から公開を始めたPEAR(PECL)チャンネルでは、チャンネルサーバーの管理にPirumを使っています。
元々はChiara_PEAR_Serverを使おうとしていたのですが、インストール後のスクリプトがうまく動かずにコードを追っかけていたところ、@iteman 先生に「PHPUnitが移行したやつを使ってみてはどうか」と勧められたのがPirumを知ったきっかけでした。
“Pirum”はラテン語で“梨の実”という意味らしく、“PEAR”そのまんまですね。公式サイトの画像がなぜナスなのかは定かではありません。


以下に公式サイトの紹介文を和訳してみました。

Pirum is a simple and nice looking PEAR channel server manager that lets you setup PEAR channel servers in a matter of minutes. Pirum is best suited when you want to create small PEAR channels for a few packages written by a few developers.
Pirumはわずか数分でPEARチャンネルサーバーをセットアップできる、シンプルで見た目の良いPEARチャンネルサーバー・マネージャーです。Pirumは少数のパッケージ・少数の開発者のためのPEARチャンネルを作るのに最適です。
Pirum consists of just one file, a command line tool, written in PHP. There is no external dependencies, no not need for a database, no need to setup credentials, and nothing need to be installed or configured.
Pirumの構成物はPHPで書かれたコマンドラインツールたったひとつです。外部依存、データベース、セットアップ証明書 (訳注: ここは訳が怪しいです。権限とした方が良い?)認証情報のセットアップ (意訳: ユーザー管理)*1、インストール・設定が必要なものは何もありません。

インストール

インストールはpearコマンドで行います。

$ pear channel-discover pear.pirum-project.org
$ pear install pirum/Pirum-beta

pirumコマンドはPEARのbin_dir*2にインストールされるので、bin_dirにパスを通すか、$(pear config-get bin_dir)/pirum を直接指定して使います。*3
引数無しでpirumを実行すると、使い方が表示されます。

$ pirum
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

サブコマンドはチャンネルサーバーを(再)構築する build と、パッケージを追加する add の2つだけと、非常にシンプルです。

チャンネルサーバーの構築

まずはチャンネルサーバー用のディレクトリとチャンネル定義のXMLを用意します。

$ mkdir pear
$ touch pear/pirum.xml
(pirum.xml を編集する)
$ cat pear/pirum.xml
<?xml version="1.0" encoding="UTF-8" ?>
<server>
  <name>pear.localhost</name>           <!--チャンネル名。pear channel-discover 等で使われる -->
  <summary>Local PEAR channel</summary> <!-- チャンネル概要 -->
  <alias>local</alias>                  <!-- name の別名 -->
  <url>http://pear.localhost/</url>     <!-- チャンネルサーバーのルートURI -->
</server>

次にbuildでチャンネルサーバーを構築します。

$ pirum build pear
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the build command:
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building releases
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command build run successfully

これでチャンネルサーバーの用意ができました。この例ではローカルにチャンネルを立てるようにしたので、httpdにバーチャルホストの設定をして再起動後、 http://pear.localhost/index.html の案内どおりにチャンネルを登録します。

$ pear channel-discover pear.localhost
Adding Channel "pear.localhost" succeeded
Discovery of channel "pear.localhost" succeeded

先にチャンネルを登録しておかないと、このチャンネル向けのパッケージが作成できないので注意してください。

$ pear package package.xml
Error: Unknown channel "pear.localhost"
Parsing of package.xml from file "package.xml" failed
Cannot package, errors in package file

パッケージの追加

詳細なパッケージの作り方は長くなるので、ここではPirumをローカルチャンネルに登録してみましょう。
まずはPirumのpackage.xmlを改変してパッケージを作ります。

$ pear download pirum/PIrum-beta
downloading Pirum-0.9.9.tgz ...
Starting to download Pirum-0.9.9.tgz (11,622 bytes)
.....done: 11,622 bytes
File /../Pirum-0.9.9.tgz downloaded
$ tar xfz Pirum-0.9.9.tgz
$ sed 's/pear.pirum-project.org/pear.localhost/g' package.xml > Pirum-0.9.9/package.xml
$ pear package Pirum-0.9.9/package.xml
Warning: Channel validator warning: field "date" - Release Date "2010-05-12" is not today
Package Pirum-0.9.9.tgz done

次にaddでパッケージを登録します。

$ pirum add pear Pirum-0.9.9.tgz

Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the add command:
   INFO   Parsing package 0.9.9 for Pirum
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building package Pirum
   INFO   Building releases
   INFO   Building releases for Pirum
   INFO   Building release 0.9.9 for Pirum
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command add run successfully

確認。

$ pear pear remote-list -c local
Channel local Available packages:
=================================
Package Version
Pirum   0.9.9

感想など

マジ簡単。それに尽きます。
チャンネルの管理をするマシンとチャンネルを公開するサーバーが異なる場合でも、FTPrsync等でディレクトリを丸ごと同期するだけです。データベースを使わないPirumのメリットと言えます。
その反面、リストや削除などのコマンドが実装されていない、パッケージの数に比例して再構築にかかる時間が増える設計になっている等、公式PEARチャンネルのような大規模なものには向いていません。あくまで小規模なチャンネル向きです。もっとも、ほとんどの場合はPirumで必要十分だとは思いますが。

TIPS

pirum.css

見た目のカスタマイズはpirum.cssで行います。通常はbuildで自動生成されるのですが、既にpirum.cssがある場合は上書きされません。

pirum.xml

公式サイトの説明にも<url>要素の中身は <url> http://pear.pirum-project.org/ </url> とスラッシュで終わっていますが、これだと書き出されるHTMLで http://pear.pirum-project.org//feed.xml のようにスラッシュが重複してしまいます。
これを避けるために僕のチャンネルやPHPUnitのチャンネルではURLの最後にスラッシュを付けないようにしています。
Pirumの現在のバージョンではこれで問題ないようですが、今後どうなるかは分かりません。

パッケージの削除

パッケージを削除するサブコマンドは実装されていませんが、パッケージファイルを手で削除したあとbuildすれば、パッケージを削除することができます。

$ rm -v pear/get/Pirum-0.9.9.t*
pear/get/Pirum-0.9.9.tar
pear/get/Pirum-0.9.9.tgz
$ pirum build pear
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the build command:
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building releases
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command build run successfully
$ pear clear-cache
reading directory /../pear/cache
123 cache entries cleared
$ pear pear remote-list -c local
No packages in channel

*1:id:fukken さんのご指摘により修正

*2:pear config-show で確認できます

*3:僕は/usr/local/binにpirumのシンボリックリンクを置いています