home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2010/01/18/PEAR_PackageProjectorでディレクトリに対してroleを設定できない・・・

日記/2010/01/18/PEAR_PackageProjectorでディレクトリに対してroleを設定できない・・・

日記 / 2010 / 01 / 18 / PEAR_PackageProjectorでディレクトリに対してroleを設定できない・・・
id: 557 所有者: msakamoto-sf    作成日: 2010-01-18 23:29:58
カテゴリ: PHP 

今日の数時間ほどの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も読み切ったわけでもないので、もうちょっと調べてみます。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-01-18 23:47:27
md5:11b03058939664c4ba8128ef79cfc182
sha1:49e7b222db69d1ff9a3ff79c7e35ab83e5a5d197
コメント
コメントを投稿するにはログインして下さい。