今日の数時間ほどのhackなので間違ってたらごめんなさい。
PEAR_PackageProjectorを使ってパッケージ作成を試みたのですが、ディレクトリに対してrole設定をできていないような気がします。
PEAR_PackageManagerはPEAR_PackageManager2を呼び出していますが、PEAR_PackageManager2の場合ディレクトリに対してrole指定したい場合は、setOptions()に渡す連想配列で次のように指定します。
$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 :
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も読み切ったわけでもないので、もうちょっと調べてみます。