今日の数時間ほどのhackなので間違ってたらごめんなさい。 PEAR_PackageProjectorを使ってパッケージ作成を試みたのですが、ディレクトリに対してrole設定をできていないような気がします。 PEAR_PackageManagerはPEAR_PackageManager2を呼び出していますが、PEAR_PackageManager2の場合ディレクトリに対してrole指定したい場合は、setOptions()に渡す連想配列で次のように指定します。 #pre||> $pkg->setOptions(array( 'dir_roles' => array( 'dir1' => 'src', 'dir2' => 'doc', 'dir3' => 'test', ... ||< こうすることで、'dir1'は"PEAR"ディレクトリに、'dir2'はpear.iniの"doc_dir"で指定されたディレクトリに、'dir3'は同じくpear.iniの"test_dir"で指定されたディレクトリに配置されるようになります。 PEAR_PackageProjectorにおけるファイル/ディレクトリのrole指定はbuild.confで以下のようにします。 [file://(src/ディレクトリに対する相対ディレクトリ)] role = {"php" or "data" or "doc" or "test" or "script" or "src"} この設定の解析結果を元に呼び出され、内部状態を設定するコードは以下のようです。 PEAR/PackageProjector/Configure/File.php : #pre||> public function setting(PEAR_PackageProjector_ProjectInfo $projinfo, $key, $value) { switch($key) { case 'ignore': $projinfo->getAttribute($this->filepath)->setIgnore(true); return true; case 'platform': $projinfo->getAttribute($this->filepath)->setPlatform($value); return true; case 'install': $projinfo->getAttribute($this->filepath)->setInstall($value); return true; case 'commandscript': $projinfo->getAttribute($this->filepath)->setCommandScript($value); return true; case 'role': $projinfo->getAttribute($this->filepath)->setRole($value); return true; } return false; } ||< $projinfo->getAttribute($this->filepath) で、filepathに対応するPEAR_PackageProjector_ProjectInfo_Attributeインスタンスが生成され、roleなりignoreなりの属性情報が保存されます。 ここまでは問題無さそうに思えます。ですが、AttributeからsetOptions()に渡すところでdir_rolesとして渡っていないように見えます。 Visitorパターンを使っているようですが、PEAR_PackageProjector_ProjectInfo_Attributeクラスのvisit()メソッドの"role"の所を見てみると、addExceptionとして'exceptions'に入れているようです。 $role = $this->_getAttr('role'); if (!is_null($role)) { $handler->buildMessage(5, "Add attribute 'role' of [{$this->path}]... {$role}", true); $package->addExceptions($this->path, $role); } これにより、setOptions()で渡す連想配列では"dir_roles"ではなく"exceptions"の方に情報が渡されます。 "exceptions"はファイル一つ一つに対してroleなどを上書く設定ですので、ディレクトリには影響しません。 実際にPackageManager2のソースをあたっても、exceptionsを用いているのはファイルに対する処理で、ディレクトリに対する処理には出てきません。 というわけでどうもこれが怪しい・・・ように思えるのですが、まだPEAR_PackageProjectorも読み切ったわけでもないので、もうちょっと調べてみます。