いまいちPackageFileManager2が使いこなせない件について(修正:ちょっとわかってきた)
非常に初歩的なことであれば、確かにPackageFileManager2を使えたのだけども、ちょいと複雑なことをしようとすると、まだまだよくわからない。
まず、依存関係について。なんとなくできたような気もするが、本当にこれでいいかはよくわからない。PackageFileManagerでは、addDependencyというメソッドがあって、それによろしくパラメータを渡すと依存の情報を含むpackage.xmlを作ってくれるらしい(試してないが)。
しかし、PackageFileManager2には、addDependencyというメソッドはない。で、いろいろソースを追いかけていたら、addPackageDepWithChannelってのが、親クラスのPEAR_PackageFile_v2_rwにあったので、それを使ってみた。ちゃんとpackage.xmlやpackage2.xmlに書かれたっぽいのだが、これでいいのかな。
で、エクステンションの依存では、addExtentionDepってのが名前的に怪しいのでそれを使ってみることにする。引数の指定はソースを読んで適当に当てはめてみた。
snip...
$packagexml->addExtensionDep('required', 'simplexml');
$packagexml->addExtensionDep('required', 'curl');
$packagexml->addPackageDepWithChannel('optional', 'Cache_Lite', 'pear.php.net');
$packagexml->addPackageDepWithChannel('optional', 'XML_RPC2', 'pear.php.net');
snip...
こんな感じか。しかし、ググっても大して情報がなかったので、間違っていたらスマン。
で、次。changelogを追記していく方法がよくわからない。(2006-08-07解決。追記参照のこと)なんとなく、すでにあるpackage.xmlを上書きしていくのかなー、なんて想像してみたりするわけだが、一度、作ったpackage.xmlがあるときにさらに作ろうとすると怒られちゃうの。こんな感じで。
PEAR_PackageFileManager2 Error: Package validation failed:
Error: Invalid tag order in <package>, found <summary> expected one of "channel, uri"
Error: package.xml <package> tag has no version attribute, or version is not 2.0
「packageタグの中の順序がおかしくて、summaryがなんちゃらで、channelもしくはuriが来るはずなんだけど。んで、packageタグにversionの属性がないよ」って読めるのだが、package.xmlを一度消したら、そんなエラーはでなくなった。そして、package2.xmlには上書きされるみたい。でも、changelogにreleaseが上書きされるので、本来そうなってほしいと思うreleaseが順々に追記されていくなんてことはないのだ。やっぱり、書き方おかしいのかなー。しかし、ソースを読んでがんばっていかなければいけないことは不毛だ。
というわけで、Services_YouTubeにCache_Liteを付けてみた。Cache_Liteは使ったことがなかったけど、思ったより簡単に使えたっぽい。。。たぶん。そして、オプションの指定でキャッシュ使用とレスポンスがSimpleXMLElementかArrayで選べるようにした。
– 2006-08-08訂正(さっき、E_STRICTで引っかかった。なので、よくわからん。)
つか、知らなかったんだけど、Cache_Liteを使ったらE_STRICTで怒られるかなーなんて思っていたけど、example.phpの中でE_STRICTを指定していても怒られなかった。たぶん、example.phpでCache_Liteをrequireしたら怒られるのかな。Cache_Liteを呼び出しているのは、Services_YouTubeの中で、そこでは、E_STRICT指定していないし。でも、将来的にはライブラリの中でもE_STRICTしたいなー。
むー。更新作業めんどくさ。早いことPEARに聞こうかなー。と言いつつ、pear-devに登録されていないのだった。で、何度やってもpear-dev-helpやsystemにメールを投げても放置なわけなので、Pierreに直接聞いてみた。なんでだろ。返事待ちか。
*もうすぐ現在のサーバが落ちます。レンタルサーバの移行をしようとしているんだけど、レジストラから今のレンタルサーバにDNSの移動に関してのメールを投げても反応がなかったって言われてるんだけど、なんなん?移行するって前もって連絡しておいて、返信までもらったのに。
–
2006-08-07
ちゅーか、リンク切れだった。
PEAR CommunityのPierreにPEARで始めるなら、0.1.0がinitial releaseだと指摘を受けましたので、バージョンを戻しておきます。
changelogのreleaseを加えていく方法がわかったよー!
PEAR_PackageFileManager2 Error: Package validation failed:
Error: Invalid tag order in <package>, found <summary> expected one of "channel, uri"
Error: package.xml <package> tag has no version attribute, or version is not 2.0
のエラーととても関係のあることだった。
エラーを読めばわかるけおd,versionが2.0じゃないんじゃない?って言われているわけだが、これを、2.0にすればよかったのだ。つまり、
$packagexml->setOptions(array('packagefile' => 'pacakge2.xml',
snip
));
なんてしてあげれば、現在のpackage2.xmlを読み込んで、そのchangelogのreleaseの中身を使用し、どんどん書き足していってくれるのだ。
なので、今回のServices_YouTubeのmakepackage.phpはこうなる。
<?php
require_once 'PEAR/PackageFileManager2.php';
PEAR::setErrorHandling(PEAR_ERROR_DIE);
$releaseVersion = '0.2.0';
$apiVersion = '0.2.0';
$changelog = '
- Add ChangeLog
- Add Tutorial
- Set Option for Cache_Lite
- Set Option for Response to be SimpleXMLElement or Array
';
$notes = 'Add Changelog, Tutorial, Option for Cache_Lite';
$packagexml = new PEAR_PackageFileManager2();
$packagexml->setOptions(array('filelistgenerator' => 'file',
'packagefile' => 'package2.xml',
'packagedirectory' => dirname(__FILE__),
'baseinstalldir' => 'Services',
'ignore' => array('makepackage.php', 'Documentation/'),
'simpleoutput' => true,
'changelogoldtonew' => true,
'changelognotes' => $changelog,
'exceptions' => array('ChangeLog' => 'doc'),
'dir_roles' => array('examples' => 'doc', 'docs' => 'doc')));
$packagexml->setPackageType('php');
$packagexml->addRelease();
$packagexml->setChannel('pear.php.net');
$packagexml->setPackage('Services_YouTube');
$packagexml->setReleaseVersion($releaseVersion);
$packagexml->setAPIVersion($apiVersion);
$packagexml->setReleaseStability('alpha');
$packagexml->setAPIStability('alpha');
$packagexml->setSummary('PHP Client for YouTube API');
$packagexml->setDescription('PHP Client for YouTube API');
$packagexml->setNotes($notes);
$packagexml->setPhpDep('5.1.0');
$packagexml->setPearinstallerDep('1.4.0a12');
$packagexml->addExtensionDep('required', 'simplexml');
$packagexml->addExtensionDep('required', 'curl');
$packagexml->addPackageDepWithChannel('optional', 'Cache_Lite', 'pear.php.net');
$packagexml->addPackageDepWithChannel('optional', 'XML_RPC2', 'pear.php.net');
$packagexml->addMaintainer('lead', 'shin', 'Shin Ohno', 'ganchiku at gmail.com');
$packagexml->setLicense('PHP License', 'http://www.php.net/license');
$packagexml->addGlobalReplacement('package-info', '@PEAR-VER@', 'version');
$packagexml->generateContents();
$pkg = &$packagexml->exportCompatiblePackageFile1();
if (isset($_GET['make']) || (isset($_SERVER['argv']) && @$_SERVER['argv'][1] == 'make')) {
$pkg->writePackageFile();
$packagexml->writePackageFile();
} else {
$pkg->debugPackageFile();
$packagexml->debugPackageFile();
}
?>
2006-08-08:
さきほども書きましたが、Pierreに0.1.0から始めるように指摘を受けましたので、ここでは、0.2.0って書いてありますが、本番用は、0.1.0に戻してあります。
すでに、package2.xmlには、0.1.0でInitial releaseってchagelogに書かれている(正確には、notesに書いてあるので、特に指定が無ければそれを使っている)ので、それを読み込んだ後、今回のmakepackage.phpに書いてあるchangelogを追記してくれるのだ!
ヤター。つーか、はまったなー。optionのpackagefileの項目にpackage2.xmlって書かないといけないなんて簡単なようで、わからんかった。しかし、やっぱりあきらめんこったな。


> 何度やってもpear-dev-helpやsystemにメールを投げても放置なわけ
そう、なんかGMailから送ったメールが届いていないような気がする。うーん。